任意文件读取与下载,一些网站的业务需求,可能提供文件查看或下载功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件
代码分析
<?php
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR."inc/function.php";
header("Content-type:text/html;charset=utf-8");
$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();
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;
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<
filec?ount<file_size){
$file_con=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_con;
} fclose($fp); 这里开始循环读取文件并返回到浏览器,可以看到没有对文件名进行过滤造成任意文件下载漏洞
通过任意文件下载与读取可以获取敏感文件 这里随便点击一张图片进行下载并用bp抓包 这里面有个filename参数可以修改成我们用读取的文件名,这里成功读取到了/etc/passwd文件
防御方案 过滤点(.)使用户在url中不能回溯上级目录 正则严格判断用户输入参数的格式 php.ini配置open_basedir限定文件访问范围
|