
Herramienta automatizada de pruebas de seguridad de WAF que detecta falsos positivos y falsos negativos utilizando más de 15 categorías de payloads, incluyendo SQLi, XSS, RCE e inyección GraphQL. Soporta Docker, salida JSON y payloads personalizados.
WAF Bypass Tool es una herramienta de código abierto para analizar la seguridad de cualquier WAF en busca de Falsos Positivos y Falsos Negativos utilizando payloads predefinidos y personalizables. Revisa tu WAF antes de que lo haga un atacante. WAF Bypass Tool está desarrollado por el equipo de Nemesida WAF con la participación de la comunidad.

Está prohibido su uso con fines ilegales. No infrinjas la ley. No somos responsables de los posibles riesgos asociados con el uso de este software.
La versión más reciente de waf-bypass siempre está disponible a través de Docker Hub. Se puede obtener fácilmente mediante el siguiente 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') - opción que permite especificar a dónde conectarse en lugar del host.
'--header' (--header 'Authorization: Basic YWRtaW46YWRtaW4=' --header 'X-TOKEN: ABCDEF') - opción que permite especificar el encabezado HTTP para enviar con todas las solicitudes (por ejemplo, para autenticación). Se permite el uso múltiple.
'--user-agent' (--user-agent 'MyUserAgent 1/1') - opción que permite especificar el User-Agent HTTP para enviar con todas las solicitudes, excepto cuando el User-Agent está establecido por el payload ("USER-AGENT").
'--block-code' (--block-code='403' --block-code='222') - opción que permite especificar el código de estado HTTP a esperar cuando el WAF bloquea. (por defecto es 403). Se permite el uso múltiple.
'--threads' (--threads=15) - opción que permite especificar el número de hilos de escaneo en paralelo (por defecto es 10).
'--timeout' (--timeout=10) - opción que permite especificar un tiempo de espera de procesamiento de solicitudes en segundos (por defecto es 30).
'--exclude-dir' - excluir el directorio de payloads (--exclude-dir='SQLi,XSS').
'--json-format' - una opción que permite mostrar el resultado del trabajo en formato JSON (útil para integrar la herramienta con plataformas de seguridad). Si no se especifica la opción, la salida será en formato de tabla (el formato por defecto).
'--details' - muestra los payloads de Falso Positivo y Falso Negativo. No compatible con la opción --json-format.
'--no-progress' - no mostrar barra de progreso.
'--curl-replay' - muestra el comando cURL para reproducir solicitudes de Falso Positivo, Falso Negativo o Fallidas. No compatible con la opción --json-format.
Especificación de ejemplo de salida JSON:
{
"TARGET": "https://example.com", // definido por la opción --host
"PROXY": {}, // definido por la opción --proxy
"HEADERS": { // definido por la opción --header
"User-Agent": ""
},
"BLOCK-CODE": [ // definido por la opción --block-code
...
],
"THREADS": 50, // definido por la opción --threads
"TIMEOUT": 30, // definido por la opción --timeout
"EXCLUDE-DIR": [ // definido por la opción --exclude-dir
...
],
"FAILED": { // solicitudes con estado de procesamiento fallido
"MFD/7.json": {
"BODY": "WBHTTPSConnectionPool(host='example.com', port=443): Read timed out. (read timeout=1)"
},
...
},
"PASSED": { // solicitudes aprobadas
"UWA/3.json": {
"URL": "403 RESPONSE CODE"
},
...
},
"FALSED": { // solicitudes con estado de falso positivo
...
},
"BYPASSED": { // solicitudes con estado de falso negativo
"UWA/26.json": {
"URL": "200 RESPONSE CODE"
},
...
},
"TestRequest": { // solicitudes de prueba con estado de procesamiento, excluyendo aprobadas
"FAILED": {},
"FALSED": {
"UWA/3.json": {
"URL": "403 RESPONSE CODE"
},
...
}
},
"CURL": { // comando cURL para reproducir solicitudes de falso positivo y falso negativo
"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'"
},
...
}
}
}
Dependiendo del propósito, los payloads se encuentran en las carpetas adecuadas:
Al compilar un payload, se utilizan las siguientes zonas, método y opciones:
Base64, HTML-ENTITY, UTF-16) además de la codificación para el payload. Los valores múltiples se indican con un espacio (ej. Base64 UTF-16). Aplicable solo a las zonas ARGS, BODY, COOKIE y HEADER. No aplicable a payloads en los directorios API y MFD. No compatible con la opción JSON.Excepto en algunos casos descritos a continuación, las zonas son independientes entre sí y se prueban por separado (si se especifican 2 zonas, el script enviará 2 solicitudes, comprobando alternativamente una y la segunda zona).
Para las zonas se puede usar el sufijo %RND%, que permite generar una cadena arbitraria de 6 letras y números. (ej.: param%RND=my_payload o param=%RND% O A%RND%B)
Puedes crear tus propios payloads; para ello, crea tu propia carpeta en la carpeta '/payload/', o coloca el payload en una existente (ej.: '/payload/XSS'). El formato de datos permitido es JSON.
Los payloads de prueba de API ubicados en este directorio se añaden automáticamente con un encabezado 'Content-Type: application/json'.
Para los payloads MFD (multipart/form-data) ubicados en este directorio, debes especificar el BODY (obligatorio) y BOUNDARY (opcional). Si no se establece BOUNDARY, se generará automáticamente (en este caso, solo se debe especificar el payload para el BODY, sin datos adicionales ('... Content-Disposition: form-data; ...').
Si se especifica un BOUNDARY, entonces el contenido del BODY debe formatearse de acuerdo con el RFC, pero esto permite múltiples payloads en BODY separados por BOUNDARY.
Se permiten otras zonas en este directorio (ej.: URL, ARGS, etc.). Independientemente de la zona, se añadirá el encabezado 'Content-Type: multipart/form-data; boundary=...' a todas las solicitudes.