任意文件读取与下载漏洞

任意文件读取与下载,一些网站的业务需求,可能提供文件查看或下载功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件

代码分析




$PIKA_ROOT_DIR =  "../../";

include_once $PIKA_ROOT_DIR."inc/function.php";

header("Content-type:text/html;charset=utf-8");
// $file_name="cookie.jpg";
$file_path="download/{$_GET['filename']}";
//用以解决中文不能显示出来的问题
$file_path=iconv("utf-8","gb2312",$file_path);

//首先要判断给定的文件存在与否
if(!file_exists($file_path)){
    skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');
    return ;
}
$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));
$buffer=1024;
$file_count=0;
//向浏览器返回数据

//循环读取文件流,然后返回到浏览器feof确认是否到EOF
while(!feof($fp) && $file_count<$file_size){

    $file_con=fread($fp,$buffer);
    $file_count+=$buffer;

    echo $file_con;
}
fclose($fp);

KaTeX parse error: Expected '}', got 'EOF' at end of input: …ath="download/{_GET[‘filename’]}";这里是要获取的文件名

//循环读取文件流,然后返回到浏览器feof确认是否到EOF
while(!feof($fp) && f i l e c o u n t < file_count< filecount<file_size){

$file_con=fread($fp,$buffer);
$file_count+=$buffer;

echo $file_con;

}
fclose($fp);
这里开始循环读取文件并返回到浏览器,可以看到没有对文件名进行过滤造成任意文件下载漏洞

通过任意文件下载与读取可以获取敏感文件
这里随便点击一张图片进行下载并用bp抓包
任意文件读取与下载漏洞_第1张图片
这里面有个filename参数可以修改成我们用读取的文件名,这里成功读取到了/etc/passwd文件
任意文件读取与下载漏洞_第2张图片

防御方案
过滤点(.)使用户在url中不能回溯上级目录
正则严格判断用户输入参数的格式
php.ini配置open_basedir限定文件访问范围

你可能感兴趣的:(任意文件下载,php,开发语言,后端)