Web安全之HTTP请求走私攻击(HTTP Request Smuggling)详解
字数 1222 2025-11-22 03:49:01
Web安全之HTTP请求走私攻击(HTTP Request Smuggling)详解
HTTP请求走私(HTTP Request Smuggling)是一种利用HTTP协议解析差异的安全漏洞,攻击者通过精心构造恶意请求,干扰服务器对HTTP请求序列的处理逻辑,导致请求被误解析,从而可能实现未授权访问、窃取数据等攻击。
一、漏洞原理:解析差异
- 背景:现代Web架构中,客户端与服务器之间通常存在多层代理或网关(如负载均衡器、CDN、WAF等)。这些中间件与后端服务器对HTTP协议的处理可能存在细微差异。
- 核心问题:当HTTP请求的边界(如
Content-Length和Transfer-Encoding头)定义不明确时,不同组件可能对同一请求的结束位置产生歧义,导致后续请求被“走私”到前一个请求的上下文中处理。 - 关键头字段:
Content-Length(CL):明确指定请求体的字节数。Transfer-Encoding: chunked(TE):使用分块编码,通过0\r\n\r\n标记结束。
二、攻击类型与步骤
-
CL-TE冲突(前端用CL,后端用TE):
- 攻击请求:
POST / HTTP/1.1 Host: example.com Content-Length: 6 Transfer-Encoding: chunked 0 G - 前端代理根据CL头读取6字节(
0\r\n\r\nG)后认为请求结束,将剩余数据(G)当作下一个请求的开始。 - 后端服务器根据TE头解析,遇到
0\r\n\r\n认为分块结束,忽略后面的G,导致G被拼接到下一个请求前,可能篡改其方法或路径。
- 攻击请求:
-
TE-CL冲突(前端用TE,后端用CL):
- 攻击请求:
POST / HTTP/1.1 Host: example.com Content-Length: 3 Transfer-Encoding: chunked 8 SMUGGLED 0 - 前端代理根据TE头解析,读取第一个分块
8\r\nSMUGGLED\r\n后,遇到0\r\n\r\n结束请求。 - 后端根据CL头只读取3字节(
8\r\n),剩余数据SMUGGLED\r\n0\r\n\r\n被附加到下一个请求。
- 攻击请求:
-
TE-TE冲突(前后端均支持TE但解析不一致):
- 通过构造畸形TE头(如
Transfer-Encoding: xchunked、重复TE头等),诱使某一端忽略TE处理,退回到CL解析。
- 通过构造畸形TE头(如
三、攻击影响
- 绕过安全控制:走私的请求可能绕过WAF或权限检查。
- 窃取用户数据:将用户请求走私到攻击者可控的端点。
- 缓存投毒:污染CDN缓存,分发恶意内容。
四、防御措施
- 禁用代理间连接复用:强制每个请求单独发送,但牺牲性能。
- 规范请求解析:前后端统一使用相同协议解析逻辑,拒绝歧义请求(如同时包含CL和TE头)。
- 使用HTTP/2:HTTP/2采用帧结构,天然避免边界歧义。
- 中间件配置:如Nginx设置
chunked_transfer_encoding off强制忽略TE头。
五、检测方法
- 时序差异:通过响应延迟判断请求是否被走私。
- 测试载荷:发送特定CL/TE组合,观察后端是否收到异常数据。
通过理解协议解析差异和构造恶意请求的逻辑,可有效识别和防御此类攻击。