任意文件下载漏洞(Unsafe File Download)是Web安全领域中一种常见的高危漏洞。当开发者未对文件下载功能进行严格的权限控制和路径校验时,攻击者可以通过构造特殊路径(如../)遍历服务器目录,下载任意敏感文件。
这个漏洞的核心在于execdownload.php文件未对filename参数进行过滤。攻击者通过修改filename参数值为"../down_nba.php",实际上是在利用路径遍历(Path Traversal)技术向上跳转目录层级。
注意:在实际渗透测试中,此类漏洞往往需要结合信息收集。攻击者需先摸清目标服务器的目录结构,才能精准定位到敏感文件位置。
首先需要搭建Pikachu靶场环境。建议使用以下配置:
访问文件下载功能页面时,正常业务流程应该是点击文件名后下载对应文件。但通过浏览器开发者工具或抓包工具(如Burp Suite)拦截请求,可以发现下载链接格式为:
code复制http://[ip:端口]/vul/unsafedownload/execdownload.php?filename=指定文件名
拦截下载请求:
使用Burp Suite拦截正常文件下载请求,或直接在浏览器地址栏修改URL参数。
构造恶意参数:
将filename参数修改为"../down_nba.php",完整URL变为:
code复制http://[ip:端口]/vul/unsafedownload/execdownload.php?filename=../down_nba.php
目录遍历尝试:
通过不断增加"../"层级,尝试访问不同目录:
敏感文件获取:
常见攻击目标包括:
重要技巧:在实际渗透中,建议先通过正常下载功能获取一些合法文件名,推测出服务器目录结构后再进行精准攻击。
开发者应在服务端对filename参数进行严格校验:
php复制// 白名单校验示例
$allowed_files = ['file1.pdf', 'file2.jpg'];
if(!in_array($_GET['filename'], $allowed_files)){
die('非法文件请求');
}
// 路径过滤示例
$filename = basename($_GET['filename']); // 去除路径信息
$filepath = 'safe_dir/'.$filename; // 限定下载目录
目录权限控制:
Web服务器配置:
nginx复制location /downloads/ {
internal; # 只允许内部请求
}
PHP安全配置:
使用工具可以提升测试效率:
bash复制# 使用wfuzz进行模糊测试
wfuzz -c -z file,wordlist.txt --hc 404 http://target/vul/unsafedownload/execdownload.php?filename=FUZZ
# 常见字典内容
../../../../etc/passwd
..././..././etc/shadow
结合文件上传漏洞:
信息泄露利用:
日志文件下载:
针对任意文件下载漏洞的WAF规则示例:
code复制SecRule ARGS_GET "\.\." \
"id:10001,\
phase:2,\
block,\
msg:'Path Traversal Attack Attempt'"
文件下载安全规范:
代码审计要点:
在一次实际渗透测试中,我发现某CMS系统存在类似漏洞。通过以下步骤成功获取系统控制权:
排查过程遇到的典型问题:
为确保防御措施有效,建议进行以下验证测试:
白名单测试:
bash复制curl "http://target/download?file=../../../etc/passwd"
# 应返回错误而非文件内容
目录限制测试:
bash复制# 尝试访问超出限定目录的文件
curl "http://target/download?file=../outside.txt"
日志审计测试:
在实际项目中,我建议将这类测试纳入常规安全审计流程,至少每季度执行一次全面检查。