
Un programma per testare la funzionalità del WAF
Strumento enterprise per la valutazione dei WAF — Payload reali. Risultati reali. Report pronti per la conformità.
WAF Tester valuta i Web Application Firewall inviando payload di attacco reali a un URL fornito dall'utente e segnalando se vengono bloccati. Disponibile come applicazione desktop Windows (Electron) e come CLI Python eseguibile ovunque.

Questo strumento è destinato esclusivamente a test di sicurezza autorizzati. Usalo solo contro sistemi di tua proprietà o per i quali hai esplicita autorizzazione scritta. Test non autorizzati di sistemi di terze parti potrebbero violare il Computer Fraud and Abuse Act (CFAA) e leggi equivalenti nella tua giurisdizione. Gli autori non si assumono alcuna responsabilità per un uso improprio.
| Suite | Test | Cosa copre |
|---|---|---|
| OWASP / CWE Core | 44 | SQL injection (12 varianti), XSS (10 varianti), path traversal, command injection, XXE, SSRF, Log4Shell, SSTI, open redirect |
| Rate Limiting | 3 | Burst flood (30 concorrenti), sequential flood, bypass tramite rotazione IP X-Forwarded-For |
| Bot Detection | 10 | sqlmap, Nikto, Nmap, Scrapy, Masscan, HeadlessChrome, python-requests, curl, User-Agent vuoto, header Accept mancanti |
| Bypass Attempts | 15 | Doppia codifica URL, unicode fullwidth, byte nulli, variazione maiuscole/minuscole, offuscamento con commenti, CRLF injection, injection header host, method override, trucchi sui path |
| API Security | 10 | GraphQL introspection/batch/enumeration, JWT algoritmo none & confusione algoritmo, mass assignment, HTTP verb tampering, BOLA, confusione content-type |
| Business Logic | 8 | Quantità negativa, invio prezzo zero, accesso a endpoint admin, HTTP parameter pollution, enumerazione account, esposizione eccessiva di dati, forced browsing, escalation privilegi |
Ogni test è associato a uno o più framework di conformità:
ALTO, PROBABILE o INCERTO invece di un semplice pass/fail binariogit clone https://github.com/kpomin57/waf-tester.git
cd waf-tester
npm install
npm start
npm run build
L'output appare in dist/ sia come installer NSIS che come .exe portatile. Non sono necessari prerequisiti sulla macchina di destinazione — Electron include il proprio runtime.
Una versione Python a file singolo che funziona ovunque Python sia disponibile — server Linux, pipeline CI/CD, container Docker, WSL o qualsiasi ambiente in cui l'eseguibile Windows non è un'opzione.
pip install rich requests
python waf_tester.py --url https://target.example.com
Esegue tutti i 90 test, richiede la conferma di autorizzazione, stampa risultati colorati nel terminale e salva un report sia in JSON che in HTML nella directory corrente.
# Esegui tutte le suite
python waf_tester.py --url https://app.example.com
# Esegui solo le suite OWASP e API
python waf_tester.py --url https://app.example.com --suites owasp,api
# Autenticazione con bearer token
python waf_tester.py --url https://app.example.com/api \
--auth-type bearer --auth-value eyJhbGciOiJIUzI1NiJ9...
# Autenticazione con chiave API
python waf_tester.py --url https://app.example.com/api \
--auth-type apikey --auth-header X-API-Key --auth-value mykey123
# Salva report in una cartella, salta conferma (CI/CD)
python waf_tester.py --url https://app.example.com \
--output-dir ./reports --confirm
# Solo output nel terminale — nessun file salvato
python waf_tester.py --url https://app.example.com --output terminal
# Instrada il traffico attraverso 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: WAF Evaluation
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: Upload report
uses: actions/upload-artifact@v3
with:
name: waf-report
path: reports/
La CLI Python può instradare tutto il traffico dei test attraverso Burp Suite, fornendo una cronologia HTTP completa di ogni payload inviato da WAF Tester. Utile per l'ispezione manuale di richieste e risposte, la messa a punto dei payload, la risoluzione di comportamenti imprevisti del WAF e l'uso dello scanner o repeater di Burp su risultati interessanti.
Burp Suite esegue un listener proxy locale (default 127.0.0.1:8080). Quando punti le variabili d'ambiente proxy di WAF Tester verso quell'indirizzo, ogni richiesta effettuata dallo strumento passa attraverso Burp prima di raggiungere la destinazione. Vedi ogni payload nella cronologia HTTP di Burp con richiesta e risposta complete — codice di stato, header, corpo — esattamente come li ha visti il WAF.
1. Avvia Burp Suite e verifica che il listener proxy sia attivo:
Apri Burp → Proxy → Proxy Settings → verifica che il listener sia su 127.0.0.1:8080 (o annota la porta se diversa).
2. Esporta il certificato CA di Burp e consideralo attendibile (configurazione una tantum):
WAF Tester si connette a destinazioni HTTPS, quindi Burp deve intercettare TLS. Vai su Burp → Proxy → Proxy Settings → Import/Export CA Certificate → Esporta come DER. Installalo come CA radice attendibile sul tuo sistema, oppure imposta la variabile d'ambiente sottostante per saltare la verifica (accettabile per uso lab, non in produzione).
3. Esegui WAF Tester con --proxy:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
Su Windows:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
Puoi anche continuare a usare le variabili d'ambiente se preferisci:
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. Disattiva l'intercettazione di Burp:
In Burp → Proxy → Intercept, assicurati che l'intercettazione sia disattivata — altrimenti Burp si fermerà su ogni richiesta in attesa che tu la inoltri manualmente, e WAF Tester andrà in timeout. Vuoi che Burp registri passivamente il traffico, non lo intercetti.
5. Guarda le richieste arrivare nella cronologia HTTP di Burp:
Ogni payload di WAF Tester appare come una voce separata. Puoi fare clic con il destro su qualsiasi richiesta e inviarla a Repeater per modificarla e reinviarla manualmente, o a Intruder per ulteriori fuzzing.
Se il certificato CA di Burp non è considerato attendibile, aggiungi una soluzione --no-verify disabilitando temporaneamente la verifica SSL nello strumento. In alternativa, rendi attendibile il certificato CA di Burp a livello di sistema o utilizza una destinazione HTTP (non HTTPS) per i test iniziali.
Livelli di confidenza:
ALTO — blocco netto (403, 406, 429) senza ambiguitàPROBABILE — keyword WAF nel corpo della risposta, o stato diverso dalla baselineINCERTO — blocco soft (400, 503) che potrebbe essere un errore legittimo dell'applicazione# Juice Shop (senza WAF — aspettati tutto bypassato)
docker run -d -p 3000:3000 bkimminich/juice-shop
# ModSecurity con OWASP CRS (aspettati la maggior parte bloccata)
docker run -d -p 80:80 owasp/modsecurity-crs:nginx
waf-tester/
├── src/
│ ├── main.js # Processo principale Electron — logica dei test e IPC
│ ├── preload.js # Ponte contestuale sicuro
│ └── renderer/
│ ├── index.html # Shell dell'app
│ ├── styles.css # Tema scuro militare/SOC
│ └── app.js # Logica UI, filtri, feed live, export
├── waf_tester.py # CLI Python — file singolo, nessuna configurazione
├── package.json
└── README.md
waf_tester.py) — file singolo, eseguibile ovunqueMIT — vedi LICENSE per i dettagli.
Realizzato per ingegneri della sicurezza che necessitano di una validazione WAF che vada oltre la semplice conformità.
| Flag | Descrizione | Default |
|---|
--url | URL di destinazione (obbligatorio) | — |
--suites | Suite da eseguire separate da virgola | all |
--auth-type | none / bearer / apikey / cookie / basic | none |
--auth-value | Token, stringa cookie o valore chiave API | — |
--auth-header | Nome header per autenticazione API key | X-API-Key |
--auth-user | Username per autenticazione Basic | — |
--auth-pass | Password per autenticazione Basic | — |
--no-baseline | Disabilita confronto baseline | off |
--no-rotate-ua | Disabilita rotazione User-Agent | off |
--waf-header | Invia header identificativo X-WAF-Tester | off |
--output | terminal, json, html (separati da virgola) | all three |
--output-dir | Directory per salvare i file di report | . |
--timeout | Timeout per richiesta in secondi | 10 |
--proxy | URL proxy per tutte le richieste (es. http://127.0.0.1:8080) | off |
--confirm | Salta la richiesta di conferma autorizzazione | off |
| Punteggio | Voto | Significato |
|---|
| 90–100% | A | Eccellente — Il WAF blocca quasi tutti i vettori di attacco |
| 80–89% | B | Buono — Lacune minori da approfondire |
| 65–79% | C | Sufficiente — Notevoli vettori di bypass presenti |
| 50–64% | D | Scarso — Lacune significative nella protezione |
| < 50% | F | Critico — Il WAF è in gran parte inefficace |