1. Pikachu靶场中的不安全文件下载漏洞解析
Pikachu漏洞测试平台是网络安全学习者和渗透测试人员常用的实战环境,其中"Unsafe Filedownload"(不安全文件下载)模块模拟了Web应用中常见的文件下载漏洞场景。这个漏洞看似简单,却可能引发服务器敏感信息泄露甚至系统沦陷。我在实际渗透测试工作中发现,超过60%的中小型网站存在类似缺陷,而开发人员往往低估其危害性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞原理与危害分析
2.1 不安全文件下载的核心机制
不安全文件下载漏洞本质上是由于服务端未对用户请求的文件路径进行严格校验,导致攻击者可以通过构造特殊路径下载服务器上的任意文件。在Pikachu靶场中,这个漏洞典型表现为以下流程:
- 前端页面展示可下载文件列表(如"好看的图片")
- 点击下载时传递文件名参数(如
download.php?filename=1.jpg) - 服务端直接拼接参数到基础路径(如
/var/www/uploads/+ 用户输入的filename)
漏洞产生的根本原因是开发者错误地认为用户只会点击页面上的合法链接,而忽略了手动修改参数的可能性。
2.2 实际危害场景演示
通过简单的路径遍历攻击,我们可以获取服务器敏感信息:
http复制GET /download.php?filename=../../../../etc/passwd HTTP/1.1
Host: target.com
这种攻击可能导致:
- 系统用户信息泄露(/etc/passwd)
- 网站源码泄露(../index.php)
- 配置文件泄露(../config/database.php)
- 会话文件读取(../tmp/sess_xxx)
重要提示:在真实测试中,建议使用../的数量要逐步增加,不同系统的目录层级可能存在差异
3. 漏洞利用实战演示
3.1 基础利用方法
在Pikachu靶场中,我们可以通过以下步骤复现漏洞:
-
正常点击"好看的图片"下载链接,捕获请求:
http复制GET /unsafe/download.php?filename=1.jpg HTTP/1.1 -
修改filename参数进行目录穿越:
http复制GET /unsafe/download.php?filename=../../1.jpg HTTP/1.1 -
逐步增加../层级直到获取目标文件
3.2 高级利用技巧
-
编码绕过:当系统过滤../时,尝试使用URL编码:
code复制%2e%2e%2f%2e%2e%2f(等同于../) -
空字节截断:在PHP旧版本中可用:
code复制filename=../../../etc/passwd%00.jpg -
大小写变异:尝试:
code复制Filename=..%2f..%2f(注意大小写)
4. 防御方案与最佳实践
4.1 输入验证与过滤
php复制// 不安全实现
$file = $_GET['filename'];
readfile("/var/www/uploads/".$file);
// 安全实现
$base_dir = '/var/www/uploads/';
$file = basename($_GET['filename']); // 去除路径
$path = realpath($base_dir.$file);
// 校验文件是否在允许目录下
if(strpos($path, $base_dir) === 0 && file_exists($path)){
readfile($path);
}else{
die("Invalid file request");
}
4.2 其他防御措施
-
白名单校验:只允许下载预定义的文件名
php复制$allowed = ['1.jpg','2.pdf']; if(!in_array($_GET['filename'], $allowed)) die(); -
文件ID映射:使用数据库ID代替真实文件名
php复制// 查询数据库获取真实路径 $stmt = $pdo->prepare("SELECT path FROM files WHERE id=?"); $stmt->execute([$_GET['file_id']]); -
内容分发:通过PHP读取文件后输出,不暴露真实路径
php复制header('Content-Type: application/octet-stream'); readfile($safe_path);
5. 渗透测试中的注意事项
- 法律风险:未经授权的测试可能违法,务必获得书面授权
- 影响评估:测试前确认操作不会导致服务中断
- 日志清理:合法测试中也应尽量减少日志污染
- 工具选择:推荐使用Burp Suite进行手动测试,自动化工具可能触发WAF
6. 漏洞挖掘进阶技巧
-
参数嗅探:不仅检查filename,还要测试:
- file
- path
- doc
- attachment
-
非常规扩展名测试:
code复制download.php?file=..././config.php.bak download.php?file=..././.env -
结合其他漏洞:
- 文件下载+XSS:当下载内容包含HTML时可能触发
- 文件下载+反序列化:下载序列化数据文件后利用
7. 企业级防护方案
对于大型应用,建议采用以下架构:
-
前端:
- 使用一次性下载令牌
- 实施严格的CORS策略
-
服务端:
- 部署WAF过滤../等敏感字符
- 使用单独的文件服务子域
- 定期审计文件权限
-
运维层:
- 关键配置文件设置600权限
- 使用容器隔离应用文件系统
- 实施严格的目录访问控制
在实际项目中,我曾遇到一个案例:攻击者通过文件下载漏洞获取数据库备份文件,最终导致百万用户数据泄露。这个教训告诉我们,即使是看似简单的文件下载功能,也需要严格的安全设计。
