
Ferramenta automatizada de teste de segurança WAF que detecta falsos positivos e falsos negativos usando mais de 15 categorias de payloads, incluindo SQLi, XSS, RCE e injeção GraphQL. Suporta Docker, saída JSON e payloads personalizados.
WAF Bypass Tool é uma ferramenta de código aberto para analisar a segurança de qualquer WAF em relação a Falsos Positivos e Falsos Negativos usando payloads predefinidos e personalizáveis. Verifique seu WAF antes que um invasor o faça. WAF Bypass Tool é desenvolvido pela equipe Nemesida WAF com a participação da comunidade.

É proibido usar para fins ilegais e ilícitos. Não infrinja a lei. Não nos responsabilizamos por possíveis riscos associados ao uso deste software.
O waf-bypass mais recente está sempre disponível via Docker Hub. Pode ser facilmente baixado através do seguinte 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') - opção permite especificar onde conectar em vez do host.
'--header' (--header 'Authorization: Basic YWRtaW46YWRtaW4=' --header 'X-TOKEN: ABCDEF') - opção permite especificar o cabeçalho HTTP a ser enviado em todas as requisições (por exemplo, para autenticação). O uso múltiplo é permitido.
'--user-agent' (--user-agent 'MyUserAgent 1/1') - opção permite especificar o User-Agent HTTP a ser enviado em todas as requisições, exceto quando o User-Agent é definido pelo payload ("USER-AGENT").
'--block-code' (--block-code='403' --block-code='222') - opção permite especificar o código de status HTTP a ser esperado quando o WAF é bloqueado. (padrão é 403). O uso múltiplo é permitido.
Exemplo de especificação de saída 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'"
},
...
}
}
}
Dependendo do propósito, os payloads estão localizados nas pastas apropriadas:
Ao compilar um payload, as seguintes zonas, método e opções são usadas:
Base64, HTML-ENTITY, UTF-16) além da codificação para o payload. Valores múltiplos são indicados com um espaço (ex.: Base64 UTF-16). Aplicável apenas às zonas ARGS, BODY, COOKIE e HEADER. Não aplicável a payloads nos diretórios API e MFD. Não compatível com a opção JSON.Exceto por alguns casos descritos abaixo, as zonas são independentes umas das outras e são testadas separadamente (se 2 zonas forem especificadas, o script enviará 2 requisições - verificando alternadamente uma e a segunda zona).
Para as zonas, você pode usar o sufixo %RND%, que permite gerar uma string arbitrária de 6 letras e números. (ex.: param%RND=my_payload ou param=%RND% OU A%RND%B)
Você pode criar seus próprios payloads; para isso, crie sua própria pasta na pasta '/payload/', ou coloque o payload em uma existente (ex.: '/payload/XSS'). O formato de dados permitido é JSON.
Os payloads de teste de API localizados neste diretório são automaticamente acrescidos de um cabeçalho 'Content-Type: application/json'.
Para payloads MFD (multipart/form-data) localizados neste diretório, você deve especificar o BODY (obrigatório) e BOUNDARY (opcional). Se BOUNDARY não for definido, será gerado automaticamente (neste caso, apenas o payload deve ser especificado para o BODY, sem dados adicionais ('... Content-Disposition: form-data; ...').
Se um BOUNDARY for especificado, então o conteúdo do BODY deve ser formatado de acordo com a RFC, mas isso permite múltiplos payloads no BODY separados por BOUNDARY.
Outras zonas são permitidas neste diretório (ex.: URL, ARGS etc.). Independentemente da zona, o cabeçalho 'Content-Type: multipart/form-data; boundary=...' será adicionado a todas as requisições.
'--threads' (--threads=15) - opção permite especificar o número de threads de varredura paralela (padrão é 10).
'--timeout' (--timeout=10) - opção permite especificar um tempo limite de processamento de requisição em segundos. (padrão é 30).
'--exclude-dir' - exclui o diretório de payloads (--exclude-dir='SQLi,XSS').
'--json-format' - opção que permite exibir o resultado do trabalho em formato JSON (útil para integrar a ferramenta com plataformas de segurança). Se a opção não for especificada, a saída será em formato de tabela (o formato padrão).
'--details' - exibe os payloads de Falso Positivo e Falso Negativo. Não compatível com a opção --json-format.
'--no-progress' - não exibe barra de progresso.
'--curl-replay' - exibe o comando cURL para reproduzir requisições de Falso Positivo, Falso Negativo ou Falha. Não compatível com a opção --json-format.