
Um programa para testar a funcionalidade de WAF
Ferramenta de Avaliação Corporativa de WAF — Payloads de ataque reais. Resultados reais. Relatórios prontos para conformidade.
O WAF Tester avalia Firewalls de Aplicação Web (WAFs) enviando payloads de ataque reais para uma URL fornecida pelo usuário e relatando se foram bloqueados. Disponível como aplicativo Windows desktop (Electron) e como CLI Python que funciona em qualquer lugar.

Esta ferramenta destina-se apenas a testes de segurança autorizados. Use-a apenas contra sistemas que você possui ou para os quais tenha permissão explícita por escrito para testar. Testes não autorizados de sistemas de terceiros podem violar o Computer Fraud and Abuse Act (CFAA) e leis equivalentes em sua jurisdição. Os autores não assumem nenhuma responsabilidade pelo uso indevido.
| Suíte | Testes | O que Cobre |
|---|---|---|
| Núcleo OWASP / CWE | 44 | SQL injection (12 variantes), XSS (10 variantes), path traversal, command injection, XXE, SSRF, Log4Shell, SSTI, open redirect |
| Rate Limiting | 3 | Burst flood (30 concorrentes), flood sequencial, bypass de rotação de IP X-Forwarded-For |
| Detecção de Bots | 10 | sqlmap, Nikto, Nmap, Scrapy, Masscan, HeadlessChrome, python-requests, curl, UA vazio, cabeçalhos Accept ausentes |
| Tentativas de Bypass | 15 | Dupla codificação URL, Unicode fullwidth, bytes nulos, variação de maiúsculas/minúsculas, ofuscação de comentários, injeção CRLF, injeção de cabeçalho Host, sobrescrita de método, truques de caminho |
| Segurança de API | 10 | GraphQL introspection/batch/enumeration, JWT none-algorithm & algorithm confusion, mass assignment, HTTP verb tampering, BOLA, content-type confusion |
| Lógica de Negócio | 8 | Quantidade negativa, submissão de preço zero, acesso a endpoint de administrador, poluição de parâmetros HTTP, enumeração de contas, exposição excessiva de dados, forced browsing, escalonamento de privilégio |
Cada teste é etiquetado para um ou mais frameworks de conformidade:
HIGH, LIKELY ou UNCERTAIN em vez de aprovação/reprovação bináriagit clone https://github.com/kpomin57/waf-tester.git
cd waf-tester
npm install
npm start
npm run build
A saída aparece em dist/ como um instalador NSIS e um .exe portátil. Nenhum pré-requisito é necessário na máquina de destino — o Electron empacota seu próprio runtime.
Uma versão em arquivo único Python que funciona em qualquer lugar onde Python esteja disponível — servidores Linux, pipelines CI/CD, contêineres Docker, WSL ou qualquer ambiente onde o .exe do Windows não seja uma opção.
pip install rich requests
python waf_tester.py --url https://target.example.com
Executa todos os 90 testes, solicita confirmação de autorização, imprime resultados codificados por cores no terminal e salva relatórios JSON e HTML no diretório atual.
# Executar todas as suítes
python waf_tester.py --url https://app.example.com
# Executar apenas as suítes OWASP e API
python waf_tester.py --url https://app.example.com --suites owasp,api
# Autenticação com token Bearer
python waf_tester.py --url https://app.example.com/api \
--auth-type bearer --auth-value eyJhbGciOiJIUzI1NiJ9...
# Autenticação com chave de API
python waf_tester.py --url https://app.example.com/api \
--auth-type apikey --auth-header X-API-Key --auth-value mykey123
# Salvar relatórios em uma pasta, pular confirmação (CI/CD)
python waf_tester.py --url https://app.example.com \
--output-dir ./reports --confirm
# Apenas saída no terminal — nenhum arquivo salvo
python waf_tester.py --url https://app.example.com --output terminal
# Roteirizar tráfego através do Burp Suite
python waf_tester.py --url https://app.example.com --proxy http://127.0.0.1:8080
docker run --rm -v $(pwd)/reports:/reports \
python:3.12-slim sh -c \
"pip install rich requests -q && python waf_tester.py \
--url https://target.example.com \
--output-dir /reports --confirm"
- name: Avaliação WAF
run: |
pip install rich requests
python waf_tester.py \
--url ${{ secrets.WAF_TARGET_URL }} \
--suites owasp,api,bypass \
--output json \
--output-dir ./reports \
--confirm
- name: Fazer upload do relatório
uses: actions/upload-artifact@v3
with:
name: waf-report
path: reports/
O CLI Python pode rotear todo o tráfego de teste através do Burp Suite, fornecendo um histórico HTTP completo de cada payload que o WAF Tester envia. Isso é útil para inspeção manual de requisições e respostas, ajuste fino de payloads, solução de problemas de comportamento inesperado do WAF e uso do próprio scanner ou repeater do Burp em achados interessantes.
O Burp Suite executa um listener de proxy local (padrão 127.0.0.1:8080). Quando você aponta as variáveis de ambiente de proxy do WAF Tester para esse endereço, cada requisição que a ferramenta faz passa pelo Burp antes de atingir o destino. Você vê cada payload no histórico HTTP do Burp com a requisição e resposta completas — código de status, cabeçalhos, corpo — exatamente como o WAF viu.
1. Inicie o Burp Suite e confirme que o listener de proxy está ativo:
Abra Burp → Proxy → Proxy Settings → confirme que o listener está em 127.0.0.1:8080 (ou anote sua porta, se diferente).
2. Exporte o certificado CA do Burp e o confie (configuração única):
O WAF Tester se conecta a destinos HTTPS, então o Burp precisa interceptar TLS. Vá em Burp → Proxy → Proxy Settings → Import/Export CA Certificate → Export as DER. Instale-o como uma CA raiz confiável em seu sistema, ou defina a variável de ambiente abaixo para pular a verificação (ok para laboratório, não para produção).
3. Execute o WAF Tester com --proxy:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
No Windows:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
Você também pode usar variáveis de ambiente, se preferir:
HTTPS_PROXY=http://127.0.0.1:8080 HTTP_PROXY=http://127.0.0.1:8080 \
python waf_tester.py --url https://target.example.com
4. Desligue a intercepção do Burp:
Em Burp → Proxy → Intercept, certifique-se de que a intercepção está desligada — caso contrário, o Burp pausará em cada requisição esperando que você a encaminhe manualmente, e o WAF Tester atingirá o time-out. Você quer que o Burp registre passivamente o tráfego, não que o intercepte.
5. Observe as requisições chegarem no histórico HTTP do Burp:
Cada payload do WAF Tester aparece como uma entrada separada. Você pode clicar com o botão direito em qualquer requisição e enviá-la para o Repeater para ajustar e reenviar manualmente, ou para o Intruder para fuzzing adicional.
Se o certificado CA do Burp não for confiável, adicione um workaround --no-verify desabilitando temporariamente a verificação SSL na ferramenta. Alternativamente, confie o CA do Burp em todo o sistema ou use um destino HTTP (não HTTPS) para testes iniciais.
Níveis de confiança:
HIGH — bloqueio firme (status 403, 406, 429) sem ambiguidadeLIKELY — palavras-chave WAF no corpo da resposta, ou status difere da linha de baseUNCERTAIN — bloqueio suave (400, 503) que pode ser um erro legítimo do aplicativo# Juice Shop (sem WAF — espere que tudo seja ignorado)
docker run -d -p 3000:3000 bkimminich/juice-shop
# ModSecurity com OWASP CRS (espere que a maioria seja bloqueada)
docker run -d -p 80:80 owasp/modsecurity-crs:nginx
waf-tester/
├── src/
│ ├── main.js # Processo principal Electron — toda a lógica de teste e IPC
│ ├── preload.js # Ponte de contexto seguro
│ └── renderer/
│ ├── index.html # Shell do aplicativo
│ ├── styles.css # Tema escuro militar/SOC da interface
│ └── app.js # Lógica da UI, filtros, feed ao vivo, exportação
├── waf_tester.py # CLI Python — arquivo único, sem configuração necessária
├── package.json
└── README.md
waf_tester.py) — arquivo único, funciona em qualquer lugarMIT — veja LICENSE para detalhes.
Construído para engenheiros de segurança que precisam de validação de WAF que vá além da conformidade de checkbox.
| Flag | Descrição | Padrão |
|---|
--url | URL de destino (obrigatório) | — |
--suites | Suítes separadas por vírgula para executar | all |
--auth-type | none / bearer / apikey / cookie / basic | none |
--auth-value | Token, string de cookie ou valor de chave de API | — |
--auth-header | Nome do cabeçalho para autenticação de chave de API | X-API-Key |
--auth-user | Nome de usuário para Autenticação Básica | — |
--auth-pass | Senha para Autenticação Básica | — |
--no-baseline | Desabilitar comparação de linha de base | off |
--no-rotate-ua | Desabilitar rotação de User-Agent | off |
--waf-header | Enviar cabeçalho de identificação X-WAF-Tester | off |
--output | terminal, json, html (separados por vírgula) | all three |
--output-dir | Diretório para salvar arquivos de relatório | . |
--timeout | Timeout por requisição em segundos | 10 |
--proxy | URL de proxy para todas as requisições (ex.: http://127.0.0.1:8080) | off |
--confirm | Pular a confirmação de autorização | off |
| Pontuação | Nota | Significado |
|---|
| 90–100% | A | Excelente — WAF bloqueando quase todos os vetores de ataque |
| 80–89% | B | Bom — pequenas lacunas que vale a pena investigar |
| 65–79% | C | Regular — vetores de bypass notáveis presentes |
| 50–64% | D | Ruim — lacunas significativas de proteção |
| < 50% | F | Crítico — WAF é amplamente ineficaz |