mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
84 lines
4.8 KiB
Markdown
84 lines
4.8 KiB
Markdown
# HTTP Connection Request Smuggling
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
**本页面总结、扩展和更新** PortSwigger 关于 [Browser-Powered Desync Attacks](https://portswigger.net/research/browser-powered-desync-attacks) 的开创性研究以及后续对 HTTP/2 连接状态滥用的工作。它专注于漏洞,其中 **每个 TCP/TLS 连接仅确定一次源**,使攻击者能够在通道建立后“走私”请求到不同的内部主机。
|
||
|
||
## Connection-State Attacks <a href="#state" id="state"></a>
|
||
|
||
### First-request Validation
|
||
|
||
在路由请求时,反向代理可能依赖 **Host**(或 HTTP/2 中的 **:authority**)头来确定目标后端服务器,通常依赖于允许访问的主机白名单。然而,许多代理存在一个漏洞,即白名单 **仅在连接中的第一个请求上强制执行**。因此,攻击者可以通过首先发送一个允许的请求,然后重用相同的底层连接来访问内部虚拟主机:
|
||
```http
|
||
GET / HTTP/1.1
|
||
Host: allowed-external-host.example
|
||
|
||
GET /admin HTTP/1.1
|
||
Host: internal-only.example
|
||
```
|
||
### First-request Routing
|
||
|
||
许多 HTTP/1.1 反向代理仅基于它们转发的第一个请求将出站连接映射到后端池。所有通过相同前端套接字发送的后续请求都会被静默重用,无论它们的 Host 头是什么。这可以与经典的 [Host header attacks](https://portswigger.net/web-security/host-header) 结合使用,例如密码重置中毒或 [web cache poisoning](https://portswigger.net/web-security/web-cache-poisoning),以获得类似 SSRF 的访问权限到其他虚拟主机:
|
||
```http
|
||
GET / HTTP/1.1
|
||
Host: public.example
|
||
|
||
POST /pwreset HTTP/1.1
|
||
Host: private.internal
|
||
```
|
||
> [!TIP]
|
||
> 在 Burp Suite Professional ≥2022.10 中,您可以启用 **HTTP Request Smuggler → Connection-state probe** 来自动检测这些弱点。
|
||
|
||
---
|
||
|
||
## 2023-2025 新增 – HTTP/2/3 连接合并滥用
|
||
|
||
现代浏览器通常会在证书、ALPN 协议和 IP 地址匹配时,将 HTTP/2 和 HTTP/3 请求合并到单个 TLS 连接上。如果前端仅授权第一个请求,则每个后续合并请求都会继承该授权 – **即使 Host/:authority 发生变化**。
|
||
|
||
### 利用场景
|
||
1. 攻击者控制 `evil.com`,该域名解析到与目标 `internal.company` 相同的 CDN 边缘节点。
|
||
2. 受害者的浏览器已经与 `evil.com` 建立了一个开放的 HTTP/2 连接。
|
||
3. 攻击者在其页面中嵌入一个隐藏的 `<img src="https://internal.company/…">`。
|
||
4. 由于连接参数匹配,浏览器重用 **现有** TLS 连接并复用对 `internal.company` 的请求。
|
||
5. 如果 CDN/路由器仅验证第一个请求,则内部主机会暴露。
|
||
|
||
Chrome/Edge/Firefox 的 PoC 可在 James Kettle 的演讲 *“HTTP/2: The Sequel is Always Worse”*(Black Hat USA 2023)中找到。
|
||
|
||
### 工具
|
||
* **Burp Suite 2023.12** 引入了一个实验性的 **HTTP/2 Smuggler** 插入点,自动尝试合并和 TE/CL 技术。
|
||
* **smuggleFuzz** (https://github.com/microsoft/smugglefuzz) – 一个在 2024 年发布的 Python 框架,用于通过 HTTP/2 和 HTTP/3 对前端/后端不同步向量进行暴力破解,包括连接状态排列。
|
||
|
||
### 缓解措施
|
||
* 始终在每个请求上 **重新验证 Host/:authority**,而不仅仅是在连接创建时。
|
||
* 在 CDN/负载均衡层禁用或严格限制 **源合并**(例如,在 NGINX 中关闭 `http2_origin_cn`)。
|
||
* 为内部和外部主机名部署单独的证书或 IP 地址,以便浏览器无法合法地合并它们。
|
||
* 在每个请求后尽可能使用 **connection: close** 或 `proxy_next_upstream`。
|
||
|
||
---
|
||
|
||
## 真实案例 (2022-2025)
|
||
|
||
| 年份 | 组件 | CVE | 备注 |
|
||
|------|-----------|-----|-------|
|
||
| 2022 | AWS 应用负载均衡器 | – | Host 头仅在第一个请求时验证;通过修补规则引擎修复(由 SecurityLabs 披露)。 |
|
||
| 2023 | Apache Traffic Server < 9.2.2 | CVE-2023-39852 | 当 `CONFIG proxy.config.http.parent_proxy_routing_enable` 设置时,允许通过 HTTP/2 连接重用进行请求走私。 |
|
||
| 2024 | Envoy Proxy < 1.29.0 | CVE-2024-2470 | 在第一个流之后对 :authority 的不当验证使得在共享网格中启用了跨租户请求走私。 |
|
||
|
||
---
|
||
|
||
## 检测备忘单
|
||
|
||
1. 在 **同一** TCP/TLS 连接中发送两个具有不同 Host 或 :authority 头的请求。
|
||
2. 观察第二个响应是否来自第一个主机(安全)或第二个主机(易受攻击)。
|
||
3. 在 Burp 中:`Repeat → keep-alive → Send → Follow`。
|
||
4. 测试 HTTP/2 时,为良性主机打开一个 **专用** 流(ID 1),然后复用第二个流(ID 3)到内部主机并查找回复。
|
||
|
||
---
|
||
|
||
## 参考文献
|
||
|
||
* PortSwigger Research – *HTTP/2: The Sequel is Always Worse*(Black Hat USA 2023)
|
||
* Envoy 安全通告 CVE-2024-2470 – 不当的权限验证
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|