
Strumento automatizzato per test di sicurezza WAF che rileva falsi positivi e falsi negativi utilizzando oltre 15 categorie di payload tra cui SQLi, XSS, RCE e GraphQL injection. Supporta Docker, output JSON e payload personalizzati.
WAF Bypass Tool è uno strumento open source per analizzare la sicurezza di qualsiasi WAF per falsi positivi e falsi negativi utilizzando payload predefiniti e personalizzabili. Controlla il tuo WAF prima che lo faccia un attaccante. WAF Bypass Tool è sviluppato dal team Nemesida WAF con la partecipazione della comunità.

È vietato l'uso per scopi illegali e illeciti. Non infrangere la legge. Non siamo responsabili per eventuali rischi associati all'uso di questo software.
L'ultima versione di waf-bypass è sempre disponibile tramite Docker Hub. Può essere scaricata facilmente tramite il seguente comando:
# docker pull nemesida/waf-bypass # docker run nemesida/waf-bypass --host='example.com'
# pipx install git+https://github.com/nemesida-waf/waf-bypass.git # <pipx bin dir>/waf-bypass
# git clone https://github.com/nemesida-waf/waf_bypass.git /opt/waf-bypass/ # python3 -m pip install -r /opt/waf-bypass/requirements.txt # python3 /opt/waf-bypass/main.py --host='example.com'
'--proxy' (--proxy='http://proxy.example.com:3128') - opzione che permette di specificare a quale indirizzo connettersi invece dell'host.
'--header' (--header 'Authorization: Basic YWRtaW46YWRtaW4=' --header 'X-TOKEN: ABCDEF') - opzione che permette di specificare l'header HTTP da inviare con tutte le richieste (ad esempio per l'autenticazione). È consentito l'uso multiplo.
'--user-agent' (--user-agent 'MyUserAgent 1/1') - opzione che permette di specificare lo User-Agent HTTP da inviare con tutte le richieste, tranne quando lo User-Agent è impostato dal payload ("USER-AGENT").
'--block-code' (--block-code='403' --block-code='222') - opzione che permette di specificare il codice di stato HTTP da aspettarsi quando il WAF blocca. (il predefinito è 403). È consentito l'uso multiplo.
'--threads' (--threads=15) - opzione che permette di specificare il numero di thread di scansione paralleli (il predefinito è 10).
'--timeout' (--timeout=10) - opzione che permette di specificare un timeout di elaborazione della richiesta in secondi (il predefinito è 30).
'--exclude-dir' - esclude la directory del payload (--exclude-dir='SQLi,XSS').
'--json-format' - un'opzione che permette di visualizzare il risultato del lavoro in formato JSON (utile per integrare lo strumento con piattaforme di sicurezza). Se l'opzione non è specificata, l'output sarà in formato tabellare (il formato predefinito).
'--details' - mostra i payload di falsi positivi e falsi negativi. Non compatibile con l'opzione --json-format.
'--no-progress' - non mostrare la barra di avanzamento.
'--curl-replay' - mostra il comando cURL per riprodurre richieste di falsi positivi, falsi negativi o fallite. Non compatibile con l'opzione --json-format.
Esempio di specifica dell'output JSON:
{
"TARGET": "https://example.com", // defined by --host option
"PROXY": {}, // defined by --proxy option
"HEADERS": { // defined by --header option
"User-Agent": ""
},
"BLOCK-CODE": [ // defined by --block-code option
...
],
"THREADS": 50, // defined by --threads option
"TIMEOUT": 30, // defined by --timeout option
"EXCLUDE-DIR": [ // defined by --exclude-dir option
...
],
"FAILED": { // requests with failed processing status
"MFD/7.json": {
"BODY": "WBHTTPSConnectionPool(host='example.com', port=443): Read timed out. (read timeout=1)"
},
...
},
"PASSED": { // passed requests
"UWA/3.json": {
"URL": "403 RESPONSE CODE"
},
...
},
"FALSED": { // requests with false positive processing status
...
},
"BYPASSED": { // requests with false negative processing status
"UWA/26.json": {
"URL": "200 RESPONSE CODE"
},
...
},
"TestRequest": { // test requests with processing status, exclude passed
"FAILED": {},
"FALSED": {
"UWA/3.json": {
"URL": "403 RESPONSE CODE"
},
...
}
},
"CURL": { // cURL command to reproduce false positive and false negative requests
"FALSED": {},
"BYPASSED": {
"UWA/26.json": {
"URL": "curl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'https://example.com/do.php#.png'"
},
...
}
}
}
A seconda dello scopo, i payload si trovano nelle cartelle appropriate:
Quando si compila un payload, vengono utilizzate le seguenti zone, metodo e opzioni:
Base64, HTML-ENTITY, UTF-16) in aggiunta alla codifica per il payload. I valori multipli sono indicati con uno spazio (es. Base64 UTF-16). Applicabile solo alle zone ARGS, BODY, COOKIE e HEADER. Non applicabile ai payload nelle directory API e MFD. Non compatibile con l'opzione JSON.Tranne per alcuni casi descritti di seguito, le zone sono indipendenti tra loro e vengono testate separatamente (quindi se vengono specificate 2 zone, lo script invierà 2 richieste, controllando alternativamente una e la seconda zona).
Per le zone puoi usare il suffisso %RND%, che permette di generare una stringa arbitraria di 6 lettere e numeri. (es.: param%RND=my_payload o param=%RND% OPPURE A%RND%B)
Puoi creare i tuoi payload, per farlo crea la tua cartella nella directory '/payload/', o posiziona il payload in una già esistente (es.: '/payload/XSS'). Il formato dati consentito è JSON.