Lab 1 - Bypassing WAF
Este desafio de nível 1 consiste em explorar uma vulnerabilidade de Cross-Site Scripting (XSS) em uma aplicação web protegida por um WAF (Web Application Firewall) básico.
URL do Desafio: https://brunomenozzi.com/desafios/xss.php
A meta é injetar e executar código JavaScript (triggar um alert()
) no contexto da página.
- Ao acessar a página, o retorno é
Please provide search parameter
. Isso nos indica que a aplicação espera um parâmetro de busca (search
) a ser provido na URL. - Testamos a reflexão do parâmetro:
- Acesso:
https://brunomenozzi.com/desafios/xss.php?search=teste
- Resultado: A palavra
teste
é refletida na página.
- Acesso:
(Ufa, não precisamos fazer fuzzing de parâmetros. Os labs geralmente facilitam essa parte para focar na exploração, e não no guessing!)
Agora, tentamos injetar uma tag HTML simples para verificar o XSS:
- Tentativa:
https://brunomenozzi.com/desafios/xss.php?search=<img>
- Resultado: A requisição é bloqueada, retornando uma mensagem de que nossa ação foi considerada maliciosa.
- Teste de Permissão de Tag:
https://brunomenozzi.com/desafios/xss.php?search=<teste>
- Resultado: A tag reflete sem problemas.
Conclusão: O WAF está bloqueando tags HTML específicas (como <img>
ou script
), mas não está verificando de forma robusta. Precisamos de um bypass para a tag bloqueada.
Existem múltiplos caminhos para contornar esse tipo de filtro. Abaixo, apresento duas abordagens válidas para este nível do desafio:
Muitos WAFs de nível básico utilizam filtros de string simples que são Case Sensitive. Se o filtro procurar apenas por <img>
em minúsculo, ele pode ignorar a versão em maiúsculo.
- Ataque Final (Payload): Utilizamos a tag
IMG
em maiúsculo.
<IMG src=x onerror=alert(document.domain)>
- URL Completa (Encoded):
[https://brunomenozzi.com/desafios/xss.php?search=%3CIMG%20src=x%20onerror=alert(document.domain)%3E](https://brunomenozzi.com/desafios/xss.php?search=%3CIMG%20src=x%20onerror=alert(document.domain)%3E)
Você também pode tentar evitar tags comuns e usar uma abordagem menos óbvia (exemplo: onload
em uma tag permitida ou tags SVG), embora a abordagem de case-sensitivity seja a solução pretendida para este nível.
- Recomendação: Se você conseguiu o XSS usando a abordagem 3.1, tente agora resolver o próximo desafio (
simple_waf_2.php
) que provavelmente exige uma técnica mais avançada!
O código fonte desse desafio pode ser encontrado aqui: https://github.com/zeroc00I/eternalnoobchallenges/blob/main/1-simple-waf.php