HTTP2降级请求走私
字数 1349 2025-08-10 08:28:15
HTTP/2降级请求走私技术详解
1. HTTP请求走私基础概念
1.1 历史背景
HTTP请求走私(HTTP Request Smuggling)概念首次在2005年Black Hat安全会议上由Chetan Kunte和Amit Klein提出,揭示了HTTP/1.1协议在处理请求时的歧义性问题。
1.2 基本原理
利用不同服务器对HTTP请求边界解析的差异,使攻击者能够插入恶意HTTP请求,导致后续正常请求被错误处理。
1.3 主要类型
- CL.TE:前端代理优先考虑Transfer-Encoding头,后端优先考虑Content-Length头
- TE.CL:前端代理优先考虑Content-Length头,后端优先考虑Transfer-Encoding头
- TE.TE:前后端对多个Transfer-Encoding头处理方式不一致
2. HTTP/2协议特性
2.1 核心改进
- 二进制分帧
- 多路复用
- 头部压缩
- 服务器推送
2.2 分帧机制
HTTP/2将通信信息分解为多个帧:
- HEADER frame(头部信息)
- CONTINUATION frame(补充头部)
- DATA frame(负载数据)
- END_STREAM标志位(结束标志)
2.3 伪头字段
HTTP/2特有的以冒号开头的特殊头部字段:
:method:HTTP请求方法:scheme:URI方案:path:请求路径(至少为"/"):authority:目标主机和端口:status:响应状态码(仅响应)
3. HTTP/2降级请求走私原理
3.1 漏洞成因
当HTTP/2流量通过代理转换为HTTP/1.x时,代理未正确处理请求边界,导致请求走私。
3.2 典型场景
- 前端支持HTTP/2的CDN
- 后端仅支持HTTP/1.x的服务
3.3 示例攻击
构造畸形HTTP/2请求:
POST / HTTP/2.0
Host: www.example.com
Content-Length: 1
aGET / HTTP/1.1
Host: www.example.com
3.4 解析差异
- HTTP/2代理:忽略Content-Length,视为单个请求
- HTTP/1.x后端:按Content-Length解析为两个请求
4. 实战案例:极客大挑战-EZ_Smuggling
4.1 场景分析
- 登录系统后有三篇普通文章和一篇admin专属文章
- 认证在HTTP/2代理层实现
- 后端为HTTP/1.x服务
4.2 攻击步骤
- 捕获正常访问请求
- 构造畸形请求:
POST /articles?id=2 HTTP/2.0
Host: x.x.x.x:8080
Content-Length: 1
aGET /admin HTTP/1.1
Host: x.x.x.x:8080
cookie: [有效session]
- 发送时不修复content-length
4.3 效果
- 前端代理:视为普通文章请求通过认证
- 后端服务:解析为两个请求,第二个为admin请求
5. 扩展攻击技术
5.1 H2.TE攻击
构造示例:
POST / HTTP/2.0
Host: www.example.com
Transfer-Encoding: chunked
a
0
GET / HTTP/1.1
Host: www.example.com
5.2 头部注入绕过
利用HTTP/2帧传输特性:
- 不再需要\r\n作为分隔符
- 可在请求头中插入特殊字符绕过过滤
6. 防御措施
6.1 服务端防护
- 禁用HTTP降级
- 严格验证请求边界
- 统一前后端解析规则
6.2 代理配置
- 拒绝包含冲突头部的请求
- 实现严格的HTTP/2到HTTP/1.x转换逻辑
6.3 开发建议
- 避免依赖客户端提供的长度信息
- 实施请求规范化处理
7. 总结
HTTP/2降级请求走私是一种新型的Web攻击技术,利用协议转换过程中的解析差异实现权限绕过。理解其原理和防御方法对构建安全的Web应用至关重要。