
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.
I payload di test API situati in questa directory vengono automaticamente aggiunti con un header 'Content-Type: application/json'.
Per i payload MFD (multipart/form-data) situati in questa directory, devi specificare BODY (obbligatorio) e BOUNDARY (opzionale). Se BOUNDARY non è impostato, verrà generato automaticamente (in questo caso, solo il payload deve essere specificato per BODY, senza dati aggiuntivi ('... Content-Disposition: form-data; ...')).
Se viene specificato BOUNDARY, il contenuto di BODY deve essere formattato in conformità con l'RFC, ma questo permette di avere più payload in BODY separati da BOUNDARY.
Altre zone sono consentite in questa directory (es.: URL, ARGS ecc.). Indipendentemente dalla zona, l'header 'Content-Type: multipart/form-data; boundary=...' verrà aggiunto a tutte le richieste.