eveplw

导航

18.文件下载漏洞

一.文件下载后台源码

<?php

//获取前端请求的文件名
$file_path = $_GET['filename'];
//设置响应头为附件下载而非内容读取
Header("Content-type: application/octet-stream");
Header("Content-Disposition: attachment; filename=".basename($file_path));
// 向页面输出文件内容
echo file_get_contents($file_path);

?>

二.修改文件路径可控

<?php
$file_path = "../Upload/{$_GET['filename']}";
if(!file_exists($file_path)){
    die("你要下载的文件不存在,请重新下载");
}

$fp = fopen($file_path,"rb");
$file_size = filesize($file_path);

//下载文件需要用到的头
// ob_clean(); //输出前一定要clean一下,否则图片打不开
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".basename($file_path));

//循环读取文件流,然后返回到浏览器feof确认是否到EOF
$buffer = 1024;
$file_count = 0;
while(!feof($fp) && $file_count<$file_size){
    $file_con = fread($fp,$buffer);
    $file_count += $buffer;
    echo $file_con;
}
fclose($fp);
?>

三.利用条件

(1)存在读文件的函数和操作

(2)读取文件的路径用户可控且未校验或校验不严

(3)输出了文件内容

四.危害

(1)下载服务器任意文件,如脚本代码,服务以及系统配置文件等

(2)可用得到的代码进一步代码审计,挖掘漏洞

五.防护

(1)过滤特殊字符.点,使用户在URL中不能穿越目录

(2)正则严格判断用户输入参数的格式

(3)php.ini配置open_basedir限定文件访问范围

(4)将文件路径保存于数据库中,通过url?id=123的方式下载文件

 

posted on 2022-09-10 22:47  eveplw  阅读(122)  评论(0编辑  收藏  举报