Pikachu靶场通关之Unsafe Filedownload
字数 2137 2025-08-15 21:33:30
不安全文件下载漏洞(Unsafe File Download)全面解析
一、漏洞原理
不安全文件下载漏洞(Unsafe File Download)是指Web系统在实现文件下载功能时,由于对用户提供的文件名参数缺乏充分的安全验证,导致攻击者可以通过构造恶意文件名路径下载服务器上的任意文件。
漏洞产生机制
-
典型工作流程:
- 用户点击下载链接
- 前端发送包含文件名的下载请求
- 后台接收请求并将文件名直接拼接到下载路径
- 服务器返回对应文件内容
-
漏洞根源:
- 直接信任前端传入的文件名参数
- 未对文件名进行安全过滤和验证
- 允许路径回溯符号(如../)
- 未限制文件下载目录范围
-
攻击原理:
攻击者通过修改filename参数为精心构造的路径(如../../etc/passwd),利用路径回溯下载系统敏感文件。
二、漏洞利用方法
基本利用步骤
- 发现文件下载功能点
- 拦截下载请求(使用Burp Suite等工具)
- 修改filename参数为恶意路径
- 重放请求获取敏感文件
靶场示例分析
以Pikachu靶场为例:
- 页面提供NBA球员图片下载功能
- 点击下载时传递filename参数
- 修改参数为
../down_nba.php可下载后台源码 - 通过源码审计可能发现更多漏洞
敏感文件路径列表
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配置信息 |
| C:\Windows\win.ini | Windows基本系统配置文件 |
Linux系统敏感文件
| 文件路径 | 用途 |
|---|---|
| /etc/passwd | 用户账户信息 |
| /etc/shadow | 用户密码哈希 |
| /etc/my.cnf | MySQL配置文件 |
| /etc/httpd/conf/httpd.conf | Apache配置文件 |
| /root/.bash_history | 用户历史命令记录 |
| /root/.mysql_history | MySQL历史命令记录 |
| /proc/mounts | 系统挂载设备信息 |
| /proc/config.gz | 内核配置文件 |
| /var/lib/mlocate/mlocate.db | 全文件路径数据库 |
| /proc/self/cmdline | 当前进程cmdline参数 |
三、漏洞危害
不安全文件下载漏洞可导致以下严重后果:
-
系统敏感信息泄露:
- 获取系统密码文件(/etc/passwd, /etc/shadow)
- 读取系统配置文件
- 获取服务配置信息(数据库、Web服务器等)
-
源代码泄露:
- 下载网站业务源代码
- 通过代码审计发现更多漏洞
- 获取数据库连接凭证
-
内网渗透跳板:
- 获取内网拓扑信息
- 发现其他系统和服务
- 为横向移动提供信息支持
-
权限提升基础:
- 结合其他漏洞实现权限提升
- 获取管理员凭据
- 控制系统关键配置文件
四、漏洞防御措施
1. 输入验证与过滤
- 过滤特殊字符:禁止
.和/等路径回溯符号 - 白名单验证:只允许特定格式的文件名(如仅字母数字)
- 正则校验:严格匹配预期的文件名格式
// 示例:白名单验证
$allowed_ext = array('jpg', 'png', 'gif');
$file_name = $_GET['filename'];
$ext = pathinfo($file_name, PATHINFO_EXTENSION);
if(!in_array($ext, $allowed_ext)) {
die('Invalid file type!');
}
2. 目录限制
- 固定下载目录:不允许指定任意路径
- 相对路径转换:将文件名转换为绝对路径前验证
- 目录权限分离:下载目录与系统目录隔离
// 示例:固定下载目录
$base_dir = '/var/www/downloads/';
$file_name = basename($_GET['filename']);
$file_path = $base_dir . $file_name;
if(!file_exists($file_path)) {
die('File not found!');
}
3. 系统级防护
- open_basedir限制:PHP配置限制文件访问范围
- 文件权限控制:敏感文件设置适当权限
- Web服务器配置:限制访问特定目录
; php.ini配置示例
open_basedir = /var/www/html/:/tmp/
4. 其他安全措施
- 文件ID映射:使用数据库ID代替真实文件名
- 日志记录:记录所有下载请求便于审计
- 内容检查:下载前验证文件内容类型
五、漏洞检测方法
-
手工测试:
- 尝试修改filename参数
- 使用../进行路径回溯测试
- 尝试下载已知的敏感文件
-
自动化工具:
- 使用Burp Suite Intruder模块
- 编写脚本批量测试常见路径
- 使用OWASP ZAP等扫描工具
-
代码审计:
- 检查文件下载功能的实现代码
- 查找未过滤的用户输入
- 验证路径拼接逻辑
六、总结
不安全文件下载漏洞是Web安全中常见的中高危漏洞,攻击者利用此漏洞可以获取系统敏感信息,为进一步攻击提供基础。开发人员应在实现文件下载功能时:
- 永远不要信任用户输入
- 实施严格的文件名验证
- 限制文件下载目录范围
- 采用最小权限原则
安全人员在进行渗透测试时,应重点关注所有文件下载功能点,尝试通过路径回溯和敏感文件枚举来检测此类漏洞。