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的方式下载文件