hacktricks/src/pentesting-web/http-connection-request-smuggling.md

84 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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}}