
Un programa para probar la funcionalidad de WAF
Herramienta de Evaluación Empresarial de WAF — Payloads de ataque reales. Resultados reales. Informes listos para cumplimiento normativo.
Probador de WAF evalúa Firewalls de Aplicaciones Web enviando payloads de ataque reales a una URL proporcionada por el usuario e informando si son bloqueados. Disponible como aplicación de escritorio para Windows (Electron) y un CLI de Python que funciona en cualquier lugar.

Esta herramienta está destinada únicamente para pruebas de seguridad autorizadas. Úsela solo contra sistemas que posea o para los que tenga permiso explícito por escrito para realizar pruebas. Las pruebas no autorizadas de sistemas de terceros pueden violar la Ley de Abuso y Fraude Informático (CFAA) y leyes equivalentes en su jurisdicción. Los autores no asumen ninguna responsabilidad por el uso indebido.
| Conjunto | Pruebas | Qué Cubre |
|---|
| Núcleo OWASP / CWE | 44 | Inyección SQL (12 variantes), XSS (10 variantes), path traversal, inyección de comandos, XXE, SSRF, Log4Shell, SSTI, redirección abierta |
| Limitación de Tasa | 3 | Ráfaga de inundación (30 concurrentes), inundación secuencial, evasión de rotación de IP X-Forwarded-For |
| Detección de Bots | 10 | sqlmap, Nikto, Nmap, Scrapy, Masscan, HeadlessChrome, python-requests, curl, UA vacío, cabeceras Accept faltantes |
| Intentos de Evasión | 15 | Codificación URL doble, Unicode fullwidth, bytes nulos, variación de mayúsculas, ofuscación de comentarios, inyección CRLF, inyección de cabecera Host, anulación de método, trucos de ruta |
| Seguridad de API | 10 | Introspección/lote/enumeración de GraphQL, algoritmo none y confusión de algoritmo JWT, asignación masiva, alteración de verbo HTTP, BOLA, confusión de tipo de contenido |
| Lógica de Negocio | 8 | Cantidad negativa, envío de precio cero, acceso a endpoint de administrador, contaminación de parámetros HTTP, enumeración de cuentas, exposición excesiva de datos, navegación forzada, escalada de privilegios |
Cada prueba está etiquetada con uno o más marcos de cumplimiento:
ALTA, PROBABLE o INCIERTA en lugar de pasar/fallar binariogit clone https://github.com/kpomin57/waf-tester.git
cd waf-tester
npm install
npm start
npm run build
La salida aparece en dist/ tanto como un instalador NSIS como un .exe portátil. No se requieren requisitos previos en la máquina de destino — Electron incluye su propio entorno de ejecución.
Una versión de Python de un solo archivo que funciona en cualquier lugar donde esté disponible Python: servidores Linux, pipelines CI/CD, contenedores Docker, WSL o cualquier entorno donde el .exe de Windows no sea una opción.
pip install rich requests
python waf_tester.py --url https://target.example.com
Ejecuta las 90 pruebas, solicita confirmación de autorización, imprime resultados codificados por colores en la terminal y guarda tanto un informe JSON como HTML en el directorio actual.
| Banderín | Descripción | Por Defecto |
|---|---|---|
--url | URL de destino (requerido) | — |
--suites | Conjuntos separados por comas a ejecutar | all |
--auth-type | none / bearer / apikey / cookie / basic | none |
--auth-value | Token, cadena de cookie o valor de clave API | — |
--auth-header | Nombre de cabecera para autenticación de clave API | X-API-Key |
--auth-user | Nombre de usuario para Autenticación Básica | — |
--auth-pass | Contraseña para Autenticación Básica | — |
--no-baseline | Deshabilitar comparación de línea base | off |
--no-rotate-ua | Deshabilitar rotación de User-Agent | off |
--waf-header | Enviar cabecera de identificación X-WAF-Tester | off |
--output | terminal, json, html (separados por comas) | todos |
--output-dir | Directorio para guardar archivos de informe | . |
--timeout | Tiempo de espera por solicitud en segundos | 10 |
--proxy | URL de proxy para todas las solicitudes (ej. http://127.0.0.1:8080) | off |
--confirm | Omitir la ventana de confirmación de autorización | off |
# Ejecutar todos los conjuntos
python waf_tester.py --url https://app.example.com
# Ejecutar solo los conjuntos OWASP y API
python waf_tester.py --url https://app.example.com --suites owasp,api
# Autenticación con token Bearer
python waf_tester.py --url https://app.example.com/api \
--auth-type bearer --auth-value eyJhbGciOiJIUzI1NiJ9...
# Autenticación con clave API
python waf_tester.py --url https://app.example.com/api \
--auth-type apikey --auth-header X-API-Key --auth-value mykey123
# Guardar informes en una carpeta, omitir confirmación (CI/CD)
python waf_tester.py --url https://app.example.com \
--output-dir ./reports --confirm
# Solo salida en terminal — sin archivos guardados
python waf_tester.py --url https://app.example.com --output terminal
# Enrutar tráfico a través de 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: Evaluación de WAF
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: Subir informe
uses: actions/upload-artifact@v3
with:
name: waf-report
path: reports/
El CLI de Python puede enrutar todo el tráfico de pruebas a través de Burp Suite, proporcionándole un historial HTTP completo de cada payload que Probador de WAF envía. Esto es útil para la inspección manual de solicitudes y respuestas, el ajuste fino de payloads, la resolución de problemas de comportamiento inesperado del WAF y el uso del propio escáner o repetidor de Burp en hallazgos interesantes.
Burp Suite ejecuta un listener de proxy local (por defecto 127.0.0.1:8080). Cuando apunta las variables de entorno de proxy de Probador de WAF a esa dirección, cada solicitud que la herramienta realiza pasa a través de Burp antes de llegar al destino. Ve cada payload en el historial HTTP de Burp con la solicitud y respuesta completas — código de estado, cabeceras, cuerpo — exactamente como lo vio el WAF.
1. Inicie Burp Suite y confirme que el listener de proxy está activo:
Abra Burp → Proxy → Configuración de Proxy → confirme que el listener está en 127.0.0.1:8080 (o tome nota de su puerto si es diferente).
2. Exporte el certificado CA de Burp y confíe en él (configuración única):
Probador de WAF se conecta a destinos HTTPS, por lo que Burp necesita interceptar TLS. Vaya a Burp → Proxy → Configuración de Proxy → Importar/Exportar Certificado CA → Exportar como DER. Instálelo como CA raíz de confianza en su sistema, o establezca la variable de entorno a continuación para omitir la verificación (es adecuado para laboratorio, no para producción).
3. Ejecute Probador de WAF con --proxy:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
En Windows:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
También puede seguir usando variables de entorno si lo prefiere:
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. Desactive la interceptación de Burp:
En Burp → Proxy → Interceptar, asegúrese de que la interceptación esté desactivada — de lo contrario, Burp se detendrá en cada solicitud esperando que la reenvíe manualmente, y Probador de WAF se agotará el tiempo de espera. Desea que Burp registre pasivamente el tráfico, no lo intercepte.
5. Observe las solicitudes llegar al historial HTTP de Burp:
Cada payload de Probador de WAF aparece como una entrada separada. Puede hacer clic derecho en cualquier solicitud y enviarla al Repetidor para modificarla y reenviarla manualmente, o al Intruso para realizar más fuzzing.
Si el certificado CA de Burp no es de confianza, agregue --no-verify como solución temporal desactivando la verificación SSL en la herramienta. Alternativamente, confíe en el certificado CA de Burp en todo el sistema o use un destino HTTP (no HTTPS) para las pruebas iniciales.
| Puntaje | Calificación | Significado |
|---|---|---|
| 90–100% | A | Excelente — el WAF bloquea casi todos los vectores de ataque |
| 80–89% | B | Bueno — brechas menores que vale la pena investigar |
| 65–79% | C | Aceptable — existen vectores de evasión notables |
| 50–64% | D | Pobre — brechas de protección significativas |
| < 50% | F | Crítico — el WAF es en gran medida ineficaz |
Niveles de confianza:
ALTA — bloqueo duro (403, 406, 429) sin ambigüedadPROBABLE — palabras clave WAF en el cuerpo de la respuesta, o el estado difiere de la línea baseINCIERTA — bloqueo suave (400, 503) que podría ser un error legítimo de la aplicación# Juice Shop (sin WAF — esperar que todos sean evadidos)
docker run -d -p 3000:3000 bkimminich/juice-shop
# ModSecurity con OWASP CRS (esperar que la mayoría sean bloqueados)
docker run -d -p 80:80 owasp/modsecurity-crs:nginx
waf-tester/
├── src/
│ ├── main.js # Proceso principal de Electron — toda la lógica de pruebas & IPC
│ ├── preload.js # Puente de contexto seguro
│ └── renderer/
│ ├── index.html # Shell de la aplicación
│ ├── styles.css # Tema oscuro militar/SOC de UI
│ └── app.js # Lógica de UI, filtros, feed en vivo, exportación
├── waf_tester.py # CLI de Python — archivo único, sin configuración necesaria
├── package.json
└── README.md
waf_tester.py) — archivo único, funciona en cualquier lugarMIT — consulte LICENCIA para más detalles.
Construido para ingenieros de seguridad que necesitan una validación de WAF que va más allá del cumplimiento de casillas de verificación.