Skip to main content
Bruno Menozzi aka Zeroc00i
Back to homepage

Lab 2 - Bypassing WAF Case Insensitive

Este desafio de nível 2 consiste em explorar uma vulnerabilidade de Cross-Site Scripting (XSS) em uma aplicação web protegida por um WAF mais robusto que o do Lab 1, agora case insensitive.

URL do Desafio: https://brunomenozzi.com/desafios/xss2.php


Passo a Passo da Resolução

A meta permanece a mesma: injetar e executar código JavaScript (triggar um alert()) no contexto da página, mas agora com um WAF mais evoluído.

1. Identificando o Parâmetro

  1. Ao acessar a página, o retorno é Please provide search parameter. Isso confirma que a aplicação continua esperando o parâmetro search na URL.
  2. Testamos a reflexão do parâmetro:
    • Acesso: https://brunomenozzi.com/desafios/xss2.php?search=teste
    • Resultado: A palavra teste é refletida na página.

(Mais uma vez, sem necessidade de fuzzing de parâmetros - foco total na exploração!)

2. Testando e Identificando o Bloqueio do WAF Avançado

Agora, testamos se as técnicas do Lab 1 ainda funcionam:

  1. Tentativa Básica: https://brunomenozzi.com/desafios/xss2.php?search=<img>
  2. Resultado: A requisição é bloqueada - WAF ainda ativo.
  3. Tentativa Case Variation: https://brunomenozzi.com/desafios/xss2.php?search=<IMG>
  4. Resultado: Também bloqueada! O WAF agora é case insensitive.

Conclusão: O WAF evoluiu e agora bloqueia tags HTML independentemente de estarem em maiúsculo ou minúsculo. Precisamos de uma abordagem mais criativa.


3. Explorando Tags Não Bloqueadas

  1. Teste de Tag Customizada: https://brunomenozzi.com/desafios/xss2.php?search=<teste>
  2. Resultado: A tag reflete sem problemas! 🎉

Insight: O WAF possui uma lista restritiva (denylist) de tags específicas (img, script, etc.), mas permite outras tags HTML. Podemos abusar dessa permissividade.


4. Desenvolvendo o Payload com Tag Customizada

Como a tag <teste> é permitida, precisamos encontrar uma forma de executar JavaScript através dela. A estratégia será:

  • Criar um elemento com id específico
  • Usar o evento onfocus para executar nosso código
  • Utilizar tabindex para tornar o elemento focalizável
  • Usar URI Fragment (#) para automaticamente focar no elemento

Payload Final:

<teste id=name onfocus=alert(document.domain) tabindex=1>

URL Completa (Encoded):

https://brunomenozzi.com/desafios/xss2.php?search=%3Cteste%20id=name%20onfocus=alert(document.domain)%20tabindex=1%3E#name

5. Explicação da Técnica

  • <teste>: Tag HTML customizada que passa pelo WAF
  • id=name: Identificador único para o elemento
  • onfocus=alert(document.domain): Executa o alert quando o elemento recebe foco
  • tabindex=1: Torna o elemento focalizável via teclado (Tab)
  • #name: Fragmento de URL que automaticamente foca no elemento com id="name"

6. Alternativas e Expansão

Esta técnica demonstra que:

  • denylists são inerentemente frágeis - sempre existem tags ou atributos não considerados
  • Event handlers menos comuns (onfocus, onblur, onmouseenter) podem ser eficazes contra WAFs básicos
  • O contexto de execução (URI fragments) pode ser explorado para triggerar eventos

Outras abordagens possíveis incluem o uso de tags SVG, eventos de mouse, ou até mesmo a combinação de múltiplas técnicas.


O código fonte desse desafio pode ser encontrado aqui: https://github.com/zeroc00I/eternalnoobchallenges/blob/main/2-simple-waf.php