HTTP请求走私攻击详解
字数 1313 2025-11-08 10:03:28
HTTP请求走私攻击详解
1. 攻击描述
HTTP请求走私(HTTP Request Smuggling)是一种利用HTTP协议解析差异的攻击技术,主要发生在多个服务器(如反向代理服务器与后端应用服务器)对HTTP请求解析不一致时。攻击者通过构造特殊的HTTP请求,使其中一个服务器误将部分请求内容解释为另一个独立请求,从而绕过安全控制、窃取数据或篡改请求。
2. 攻击原理
关键背景:HTTP请求边界解析差异
- HTTP/1.1协议允许通过
Content-Length(CL)和Transfer-Encoding(TE)两种头部标识请求体长度。 - 若同一请求中同时存在这两个头部,不同服务器可能优先处理其中一个,导致对请求体结束位置的判断出现分歧。
- 常见场景:反向代理(如Nginx)与后端服务器(如Apache、IIS)的解析逻辑不同。
两种主要攻击类型
- CL-TE走私:前端代理使用
Content-Length,后端使用Transfer-Encoding。 - TE-CL走私:前端代理使用
Transfer-Encoding,后端使用Content-Length。 - TE-TE走私:前后端均支持
Transfer-Encoding,但通过混淆编码格式(如大小写、重复头部)触发解析差异。
3. 攻击步骤示例(以CL-TE为例)
步骤1:构造恶意请求
攻击者发送以下请求,其中:
Content-Length: 44表示请求体长度为44字节。Transfer-Encoding: chunked表示后端应使用分块编码解析。
POST /api HTTP/1.1
Host: example.com
Content-Length: 44
Transfer-Encoding: chunked
0
GET /secret HTTP/1.1
Host: example.com
步骤2:前端代理解析
- 前端代理根据
Content-Length: 44读取44字节(从0到第二个Host行结束),将整个内容作为单个请求转发给后端。
步骤3:后端服务器解析
- 后端优先处理
Transfer-Encoding: chunked,按分块编码解析:- 第一块:
0(长度为0,表示结束)。 - 剩余内容(
GET /secret...)被误认为下一个请求,并发送给后端应用。
- 第一块:
步骤4:攻击效果
- 第二个请求(
GET /secret)可能绕过认证,直接访问敏感接口。 - 若与其他用户请求并发,可能篡改他人请求(如窃取Cookie)。
4. 防御措施
- 禁用协议混淆:
- 配置服务器严格拒绝同时包含
CL和TE头部的请求。
- 配置服务器严格拒绝同时包含
- 统一解析标准:
- 确保整个请求链(代理+后端)使用相同的解析优先级(如优先处理
TE)。
- 确保整个请求链(代理+后端)使用相同的解析优先级(如优先处理
- 使用HTTP/2:
- HTTP/2通过帧机制明确划分请求边界,从根本上避免走私问题。
- 安全配置:
- 对反向代理(如Nginx)设置
chunked_transfer_encoding off强制使用CL。 - 后端服务器启用严格模式(如Apache的
MergeSlashes On)。
- 对反向代理(如Nginx)设置
5. 检测方法
- 发送测试请求并观察响应延迟、异常状态码或数据泄露。
- 使用工具(如
http-request-smuggling扫描器)自动化检测。
通过理解解析差异、构造特定载荷,并结合防御配置,可有效应对HTTP请求走私攻击。