浅谈HTTP请求走私
字数 1417 2025-08-20 18:17:47
HTTP请求走私攻击详解
漏洞成因
Keep-Alive与Pipeline机制
HTTP/1.1中默认启用了两个关键特性:
-
Keep-Alive:通过
Connection: Keep-Alive请求头告知服务器不要关闭TCP连接,后续请求可重用同一连接,减少握手开销。 -
Pipeline:客户端可以像流水线一样连续发送多个HTTP请求,而不必等待服务器响应。服务器需遵循先入先出机制处理请求。
关键头部:CL与TE
-
Content-Length (CL):指定请求主体的字节长度。
-
Transfer-Encoding (TE):指定传输编码方式,重点关注
chunked:- 数据被分成一系列块发送
- 每个块格式:
[十六进制长度]\r\n[数据]\r\n - 终止块:
0\r\n\r\n - 示例:
b\r\n q=smuggling\r\n 6\r\n hahaha\r\n 0\r\n \r\n
RFC规范:当CL和TE同时出现时,Content-Length应被忽略。但不同服务器实现不一致导致漏洞。
攻击类型
1. CL-TE攻击
前置服务器:优先处理Content-Length
后端服务器:优先处理Transfer-Encoding
示例攻击请求:
POST / HTTP/1.1
Host: example.com
Content-Length: 6
Transfer-Encoding: chunked
0
A
- 前置服务器认为整个请求长度为6字节(
0\r\n\r\n) - 后端服务器处理到
0\r\n\r\n认为请求结束 - 剩余的"A"会与下个请求拼接
2. TE-CL攻击
前置服务器:优先处理Transfer-Encoding
后端服务器:优先处理Content-Length
示例攻击请求:
POST / HTTP/1.1
Host: example.com
Content-Length: 4
Transfer-Encoding: chunked
17
POST /secret HTTP/1.1
0
- 前置服务器处理整个分块请求
- 后端服务器只读取前4字节(
17\r\n) - 剩余部分成为走私请求
3. TE-TE攻击
通过混淆TE头部使前后端解析不一致:
混淆方式:
Transfer-Encoding: xchunkedTransfer-Encoding[空格]: chunkedTransfer-Encoding: chunked\r\nTransfer-Encoding: x[空格]Transfer-Encoding: chunkedX: X[\n]Transfer-Encoding: chunked
漏洞利用场景
- 绕过安全限制:绕过前置服务器的访问控制
- 窃取用户请求:获取其他用户的敏感数据如Cookie
- 反射型XSS:组合利用实现XSS
- 重定向攻击:将站内重定向变为开放重定向
- 缓存投毒:污染缓存内容
- 缓存欺骗:欺骗缓存系统存储恶意内容
实例分析:窃取用户请求
攻击请求:
POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 325
Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1
Host: vulnerable.com
Content-Length: 665
Content-Type: application/x-www-form-urlencoded
Cookie: attacker_session=...
csrf=...&postId=3&comment=a
效果:
- 后端处理完初始请求后,缓冲区保留评论提交请求
- 当其他用户请求到达时,会被拼接到评论的comment参数中
- 攻击者可在页面查看其他用户的完整请求
防御措施
- 禁用连接重用:在代理与后端间禁用TCP连接重用
- 升级HTTP/2:HTTP/2的二进制帧机制天然防御此类攻击
- 统一服务器:前后端使用相同服务器软件
- 严格实现RFC:正确处理CL和TE头部
- 规范化处理:拒绝非标准TE头部
HTTP/2的防御原理
- 使用二进制帧而非文本格式
- 每个帧有明确编号和长度
- 单个TCP连接可承载多个双向流
- 不再依赖换行符分隔请求
- 天然支持多路复用,无需Pipeline
总结
HTTP请求走私攻击利用前后端服务器对请求边界解析不一致的漏洞,通过精心构造的CL和TE头部实现请求注入。防御关键在于规范实现和统一解析逻辑,升级到HTTP/2是最彻底的解决方案。