本技能是一份 HTTP/2 协议层攻击手册,面向安全测试场景,聚焦于 HTTP/2 独有的攻击面,而非 HTTP/1.1 的基础请求走私。基础模型常将 HTTP/2 走私与 HTTP/1.1 走私混为一谈,本技能专门梳理 H2 特有的攻击技术。
一、用途 当目标支持 HTTP/2,且需要利用二进制分帧、HPACK 压缩、h2c 升级走私、伪首部操纵、单包竞态条件以及 H2→H1 降级注入等特性时使用。
二、HTTP/2 攻击面概览
- 二进制分帧:帧级操纵、解析器差异。
- HPACK 压缩:压缩预言机(CRIME/BREACH)、表投毒。
- 多路复用:单包竞态条件、RST_STREAM 洪泛。
- 服务器推送:通过非请求推送进行缓存投毒。
- 伪首部(:method/:path/:authority/:scheme):注入、请求拆分、路径差异。
三、h2c(HTTP/2 明文)走私 h2c 是不带 TLS 的 HTTP/2,通过 HTTP/1.1 的 Upgrade 机制协商。许多反向代理会盲目转发 Upgrade: h2c 头而不理解其含义,从而允许攻击者绕过代理层访问控制。 攻击流程:客户端发送带 Upgrade: h2c、HTTP2-Settings、Connection: Upgrade, HTTP2-Settings 的 HTTP/1.1 请求;代理转发(不理解 h2c);后端返回 101 Switching Protocols;客户端与后端之间变为 HTTP/2;代理成为 TCP 隧道,无法检查/过滤 H2 帧;客户端直接向后端发送 H2 请求,绕过代理规则。 可绕过:基于路径的访问控制、WAF 规则、速率限制、认证、IP 限制。 工具 h2csmuggler 安装与用法: git clone https://github.com/BishopFox/h2csmuggler cd h2csmuggler pip3 install h2 python3 h2csmuggler.py -x https://target.com/ --test python3 h2csmuggler.py -x https://target.com/ -X GET -p /admin/users python3 h2csmuggler.py -x https://target.com/ -X GET -p /admin -H "Authorization: Bearer token123" 检测命令: curl -v --http1.1 https://target.com/ -H "Upgrade: h2c" -H "HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA" -H "Connection: Upgrade, HTTP2-Settings" 返回 101 Switching Protocols 表示支持 h2c;返回 200/400/其他表示不支持或代理阻止升级。
四、伪首部注入 HTTP/2 用伪首部替代请求行::method 对应请求方法,:path 对应请求 URI,:authority 对应 Host 头,:scheme 对应协议。
- 路径差异:代理按 :path 路由,后端使用不同解析。例如 :path: /public/../admin/users,代理匹配 /public/* 规则放行,后端规范化后为 /admin/users 提供管理内容。
- 重复伪首部注入:规范禁止重复伪首部,但实现各异。代理可能用第一个 :path 路由,后端可能用最后一个 :path 提供服务。
- authority 与 Host 不一致::authority 与 host 指向不同主机,导致代理路由到公共虚拟主机、后端提供管理虚拟主机内容。
- scheme 操纵:若后端信任 :scheme 判断请求是否“内部”,:scheme: http 可能被当作内部请求而获得不受限访问。
五、HPACK 压缩攻击
- CRIME/BREACH on HTTP/2:HPACK 压缩头部,若攻击者控制部分头部且同一压缩上下文中存在秘密,匹配猜测会产生更小帧,形成预言机。限制:HPACK 使用静态+动态表(非原始 DEFLATE),每连接表,需在同一连接上大量请求,比原始 CRIME 更难。
- 头部表投毒:HPACK 动态表在同一连接上跨请求存储近期头部。攻击者发送 X-Custom: malicious-value 加入动态表,后续请求可能引用该条目;若 CDN/代理复用连接,攻击者与受害者共享表,导致跨请求泄露。
六、流多路复用滥用
- 单包攻击(竞态条件):HTTP/2 多路复用允许在单个 TCP 包中发送多个请求,实现真正同时的服务器端处理。示例代码使用 h2 库准备所有请求并在单次写入中发送,将 20 个请求的帧打包进单个 TCP 包。
- RST_STREAM 洪泛(CVE-2023-44487 “Rapid Reset”):HEADERS(打开流)→ RST_STREAM(取消)→ 每秒重复数千次;服务器处理每次打开/关闭但客户端不等待响应;放大效应:极小客户端资源导致大量服务器 CPU 耗尽。
- PRIORITY 操纵:在攻击者流上设置 exclusive=true + weight=256,饿死其他用户请求。
七、HTTP/2 → HTTP/1.1 降级问题
- 通过二进制格式进行头部注入:H2 头部值是二进制,\r\n 在值内是合法数据。当代理降级到 H1 时,头部值中的 \r\n 变成实际换行,导致头部注入。
- 传输编码走私:H2 规范禁止 transfer-encoding,但某些代理在降级时透传,后端处理分块编码,形成 H2.TE 走私。
- 内容长度差异:H2 使用帧长度(无需 CL)。若代理在降级时生成 CL,而攻击者也发送了 CL 头,长度冲突导致请求走私。
- 头部名称大小写:H2 要求小写。发送大写 Transfer-Encoding 在 H2 中无效,但某些代理透传,在后端成为合法 H1 头。
八、服务器推送缓存投毒 攻击:触发对 /static/app.js 的服务器推送,内容由攻击者控制;PUSH_PROMISE 帧推送恶意响应;浏览器/CDN 在合法 URL 下缓存被投毒内容;后续所有加载都提供攻击者内容。缓解:多数现代浏览器/CDN 限制或禁用服务器推送。
九、决策树 目标支持 HTTP/2?
- 是:代理是否支持 h2c 升级?是→h2c 走私;否→继续。代理与后端之间是否 H2→H1 降级?是→二进制格式头部注入(TE 透传→H2.TE 走私;CL 差异→H2.CL 走私);否(端到端 H2)→继续。需要竞态条件?是→通过多路复用的单包攻击;否→继续。伪首部操纵是否可行?:path 差异→路径混淆;:authority vs Host→虚拟主机混淆;:scheme 操纵→访问控制绕过。服务器推送是否启用?是→通过推送的缓存投毒;否→继续。DoS 目标?RST_STREAM 快速重置;PRIORITY 饥饿。
- 否(仅 HTTP/1.1):参见 HTTP/1.1 特定技术。
十、工具参考
- h2csmuggler:h2c 升级走私(github.com/BishopFox/h2csmuggler)
- http2smugl:H2 特定去同步测试(github.com/neex/http2smugl)
- h2(Python):用于帧构造的 HTTP/2 协议库(github.com/python-hyper/h2)
- nghttp2:H2 客户端/服务器工具(nghttp2.org)
- Burp HTTP Request Smuggler:自动化变体扫描
- curl --http2:快速 H2 探测(内置)
十一、快速参考 h2c 探测: curl -v --http1.1 https://target.com/ -H "Upgrade: h2c" -H "Connection: Upgrade, HTTP2-Settings" -H "HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA" H2 支持检查: curl -v --http2 https://target.com/ 2>&1 | grep "ALPN"
十二、限制 本技能为攻击技术手册,仅应在获得授权的安全测试中使用。资料未提供具体收费、价格、平台或效果信息。