一次任意文件下载之代码审计
字数 1376 2025-08-15 21:31:21
任意文件下载漏洞代码审计与利用实战教学
漏洞概述
任意文件下载漏洞(Arbitrary File Download)是一种常见的Web安全漏洞,允许攻击者通过构造特殊参数下载服务器上的任意文件,可能导致敏感信息泄露、系统沦陷等严重后果。
漏洞发现过程
1. 初始发现
- 发现文档下载链接,形式可能为:
http://example.com/download.php?file=example.pdf - 通过修改
file参数尝试下载其他文件,如:/index.php
2. 信息收集
- 成功下载首页文件
index.php后,尝试从中提取敏感信息:- 数据库连接配置(用户名、密码、主机等)
- 系统路径信息
- 其他包含文件线索
3. 源码获取
- 通过
index.php中的注释信息或特定代码片段:- 使用搜索引擎(Baidu/Google)搜索相关关键词
- 在GitHub等代码托管平台搜索特定代码片段
- 成功找到并下载相关源码进行审计
漏洞利用链
1. 任意文件下载 → 信息泄露
- 直接下载关键系统文件获取敏感信息
- 分析系统架构和配置
2. 发现文件包含漏洞
- 审计发现系统存在文件包含漏洞
- 利用条件:
- PHP版本 < 5.3.4
magic_quotes_gpc设置为OFF
- 利用%00截断技术:
http://localhost/index.php?a=../xxx.php%00
3. 寻找上传点
- 在源码中发现Kindeditor编辑器组件
- 定位到上传接口:
upload_json.php
4. 构造图片上传
- 通过编辑器上传功能构造图片上传
- 上传路径示例:
/uploadfile/image/20190410/20190410211839_24249.jpg
5. 文件包含Getshell
- 结合文件包含漏洞和上传的图片文件:
http://localhost/index.php?a=../uploadfile/image/20190410/20190410211839_24249.jpg%00 - 通过图片中包含的恶意代码获取Webshell
漏洞代码分析
任意文件下载漏洞代码
典型的有缺陷下载代码:
$file = $_GET['file'];
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
readfile($file);
问题点:
- 直接使用用户输入的
file参数 - 未对文件路径进行校验和限制
- 使用
basename()不足以防止目录遍历
文件包含漏洞代码
$page = $_GET['a'];
include($page . '.php');
问题点:
- 未过滤用户输入
- 在PHP旧版本中可利用%00截断
防御措施
1. 任意文件下载防御
- 白名单限制可下载文件
- 校验文件路径是否在允许目录内
- 使用文件ID而非直接路径
- 示例修复代码:
$allowed = ['file1.pdf', 'file2.doc'];
$file = $_GET['file'];
if(in_array($file, $allowed)) {
$path = '/safe/directory/' . $file;
// 其他下载逻辑
} else {
die('Invalid file request');
}
2. 文件包含防御
- 避免动态包含用户可控文件
- 使用白名单机制
- 更新PHP版本(>=5.3.4)
- 示例修复代码:
$pages = ['home', 'about', 'contact'];
$page = $_GET['a'];
if(in_array($page, $pages)) {
include($page . '.php');
} else {
include('404.php');
}
3. 文件上传防御
- 校验文件类型(内容而非扩展名)
- 重命名上传文件
- 设置上传目录不可执行
- 限制上传文件大小
渗透测试方法论
- 信息收集:通过下载文件获取系统信息
- 源码审计:分析下载的源代码寻找其他漏洞
- 漏洞链构造:结合多个漏洞实现更高危攻击
- 权限提升:从文件下载到获取系统控制权
总结
本案例展示了如何通过任意文件下载漏洞获取系统信息,结合源码审计发现文件包含漏洞,最终通过文件上传功能实现Getshell的完整过程。这种漏洞链利用方式在实际渗透测试中非常常见,防御时需要采取多层次的安全措施。