Introducción a los WAF
Los firewalls evolucionaron a medida que los ataques se volvieron más sofisticados.
Un WAF mal configurado o ausente puede convertir una simple inyección SQL en una brecha total. Comprender cómo funcionan internamente es el primer paso para evadir los que bloquean tus pruebas — y para defender los que proteges.
Evolución histórica de los firewalls
Los firewalls evolucionaron a medida que los ataques se volvieron más sofisticados.
Filtro de paquetes sin estado (stateless) — Opera en capas 3–4 del modelo OSI. Evalúa cada paquete en aislamiento sin recordar conexiones anteriores. Vulnerable al ACK flag spoofing: un atacante envía un paquete con el flag ACK activo y el firewall lo trata como parte de una conexión establecida.
Firewall de estado (stateful) — Mantiene una tabla de conexiones activas. Detecta paquetes fuera de secuencia y valida los flags TCP contra el estado esperado. Resuelve el ACK spoofing, pero opera exclusivamente en capas 3–4.
Application-Level Gateway (ALG / Proxy Firewall) — Actúa como intérprete de protocolo: termina la conexión entrante e inicia una nueva en nombre del cliente. Permite visibilidad completa de protocolos de capa 7 como HTTP y FTP. Base conceptual de la inspección L7.
Deep Packet Inspection (DPI) — Inspecciona la carga útil completa de los paquetes, no solo las cabeceras. Detecta secuencias de bytes características de malware o tráfico C2. Carece de contexto de aplicación: puede detectar un UNION SELECT pero no saber si es legítimo.
Next-Generation Firewall (NGFW) — Combina inspección con estado + DPI + IPS integrado + descifrado SSL/TLS + identificación de usuarios/aplicaciones (via Active Directory, certificados, SAML). Aplica políticas basadas en usuario y aplicación, no solo en tuples IP/puerto. Aún carece de la granularidad necesaria para lógica de aplicaciones web.
| Tipo de Firewall | Capas OSI | Capacidad clave |
|---|---|---|
| Filtro sin estado | L3–L4 | Reglas estáticas por IP/puerto. Sin memoria de sesión |
| Inspección de estado | L3–L4 | Tabla de conexiones activas; valida flags TCP/UDP |
| ALG / Proxy Firewall | L7 (específico) | Termina y reinicia sesiones de capa de aplicación |
| DPI | L3–L7 | Inspecciona carga útil completa en busca de patrones |
| NGFW | L3–L7 + Identidad | DPI + IPS + descifrado TLS + identidad de usuario/app |
Web Application Firewall (WAF)
Un WAF inspecciona tráfico HTTP(S) —entrante y saliente— para detectar intenciones maliciosas. A diferencia de un NGFW que clasifica aplicaciones, un WAF habla HTTP con fluidez: analiza métodos, cabeceras, cookies, query strings y cuerpos POST para detectar ataques como SQLi, XSS, file inclusion e inyección de comandos (OWASP Top 10).
Virtual patching: los WAF pueden mitigar vulnerabilidades conocidas sin requerir cambios en el código fuente. Si una regla no cubre una variante específica de la carga útil, esta la atraviesa igualmente.
Modelos de despliegue
| Modelo | Descripción | Ejemplos |
|---|---|---|
| Cloud (proxy inverso) | Tráfico enrutado a través de la infraestructura del proveedor vía DNS. WAF termina TLS | Cloudflare, AWS WAF, Akamai, Imperva Cloud |
| Network appliance | Dispositivo físico o virtual en línea, frecuentemente con balanceador de carga | F5 Advanced WAF, Fortinet WAF, Barracuda WAF |
| Host-based (integrado) | Módulo dentro del servidor web | ModSecurity + OWASP CRS |
Fingerprinting de WAF
Identificar la presencia y tipo de WAF antes de atacar permite: evitar cargas que serán bloqueadas, seleccionar técnicas de evasión dirigidas y ajustar el ritmo de las pruebas.
1. Inspección pasiva de cabeceras
curl -I http://TARGETIndicadores de WAF en las respuestas HTTP:
| Cabecera / Valor | WAF detectado |
|---|---|
server: cloudflare |
Cloudflare |
X-Sucuri-Id: 67 |
Sucuri |
X-CDN: Imperva |
Incapsula / Imperva |
Akamai-Origin-Hop: 2 |
Akamai |
X-F5-Application: ASM |
F5 Advanced WAF |
2. Análisis de comportamiento (activo)
Enviar payloads “inofensivos” que coincidan con firmas comunes de ataque:
# Solicitud normal → 200 OKcurl -I "http://MACHINE_IP/search.html?q=test"
# Con SQLi trigger → 403 Forbidden si hay WAFcurl -I "http://MACHINE_IP/search.html?q=test'%20OR%201=1--"Interpretación de respuestas:
| Respuesta | Significado probable |
|---|---|
403 Forbidden, página en blanco |
Bloqueo WAF clásico |
406 Not Acceptable |
Común en ModSecurity CRS |
| Página HTML personalizada “Acceso denegado” | Específico del proveedor |
| Respuesta retardada (>500 ms) | Inspección aérea del WAF |
| Sin cambios respecto a la búsqueda normal | Posiblemente sin WAF o sonda ciega |
3. Fingerprinting automatizado con wafw00f
wafw00f detecta más de 500 WAF mediante un proceso de sondeo progresivo:
- Solicitud HTTP estándar: analiza respuesta, código de estado, cabeceras.
- Si no es concluyente: envía un conjunto controlado de solicitudes maliciosas y mapea comportamientos.
- Si todavía sin resolver: analiza tiempos de respuesta y patrones residuales.
wafw00f http://TARGETResultado: identifica el WAF por nombre o confirma la presencia de “algún control de seguridad” aunque no identifique el tipo exacto.
4. Nmap http-waf-fingerprint
Para escaneo de subred (vs. host individual):
nmap -p 80,443 --script http-waf-fingerprint TARGET_IPLimitación: permanece silencioso cuando no identifica el WAF por nombre. wafw00f es preferible en análisis de host único.
Detección por firmas vs. por comportamiento
Detección basada en firmas
Compara el contenido de cada paquete contra una lista de firmas maliciosas conocidas. Rápido y con bajo ratio de falsos positivos.
Evasiones comunes:
- Encoding:
' OR 1=1--→%27%20OR%201%3D1%2D%2D - Variante de case:
UNION SELECT→unIOn sElEcT - Inserción de comentarios:
SELECT→SEL/**/ECT - Sintaxis alternativa:
SLEEP(10)→IF(1=1, SLEEP(10), 1)
| Ventajas | Desventajas |
|---|---|
| Bajos falsos positivos (bien ajustado) | Ciego a ofuscación (encoding, comentarios) |
| Fácil de escribir y entender | No detecta ataques de día cero |
| Alto rendimiento (motores regex rápidos) | Requiere actualizaciones constantes |
Detección basada en comportamiento / anomalías
Aprende la normalidad (longitud de input, número de parámetros, tipos de datos, tasa de sesiones) y marca desviaciones. El input username=' OR '1'='1 se desvía de la normalidad de un nombre de usuario (caracteres especiales, espacios en blanco).
| Ventajas | Desventajas |
|---|---|
| Detecta ataques desconocidos (día cero) | Alto ratio de falsos positivos |
| Más difícil de evadir con encoding simple | Requiere período de entrenamiento |
| Se adapta a la lógica de la aplicación | Computacionalmente costoso |
Detección híbrida
WAFs comerciales modernos combinan ambos enfoques: comprobación rápida de firmas → inspección de anomalías → puntuación de riesgo ponderada → decisión sobre el paquete.
Anatomía de una regla WAF (ModSecurity / OWASP CRS)
Ejemplo real: regla 942101 del OWASP CRS v3.3.7 para detección de SQLi.
SecRule REQUEST_BASENAME "@detectSQLi" \ "id:942101,\ phase:2,\ block,\ capture,\ t:none,t:utf8toUnicode,t:urlDecodeUni,t:removeNulls,\ msg:'SQL Injection Attack Detected via libinjection',\ logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',\ tag:'attack-sqli',\ tag:'OWASP_CRS',\ tag:'capec/1000/152/248/66',\ tag:'PCI/6.5.2',\ tag:'paranoia-level/3',\ ver:'OWASP_CRS/3.3.7',\ severity:'CRITICAL',\ setvar:'tx.sql_injection_score=+%{tx.critical_anomaly_score}',\ setvar:'tx.anomaly_score_pl3=+%{tx.critical_anomaly_score}'"Desglose por sección:
Trigger — SecRule REQUEST_BASENAME "@detectSQLi":
SecRule: directiva estándar de ModSecurityREQUEST_BASENAME: inspecciona el nombre de archivo/endpoint de la URL (e.g., en/api/user/123, el basename es123)@detectSQLi: llama a libinjection, librería C especializada que tokeniza la entrada como un analizador SQL real (en lugar de buscar strings como' OR 1=1)
Metadatos:
id:942101: identificador único (esquema de numeración CRS)phase:2: se ejecuta durante el procesamiento del cuerpo de la solicitudblock: acción → rechazar la solicitudcapture: guarda la carga útil coincidente para logging
Normalización de entrada (antes de que @detectSQLi se ejecute):
t:none: comenzar con input sin procesart:utf8toUnicode: convierte secuencias UTF-8 a Unicodet:urlDecodeUni: decodificación URL recursiva (maneja doble-encoding:%2527→%27→')t:removeNulls: elimina bytes nulos (%00), usados para terminar strings en parsers C
Logging y atribución:
msg: alerta legible que aparece en logs y SIEMlogdata: detalles forenses:%{TX.0}(carga exacta),%{MATCHED_VAR_NAME}(variable inspeccionada),%{MATCHED_VAR}(valor completo)
Tags (ganchos operativos):
capec/1000/152/248/66: enlace a CAPEC para modelado de amenazasPCI/6.5.2: requisito PCI DSS para protección contra inyecciónparanoia-level/3: CRS usa 4 niveles de paranoia; PL3 es más estricto con mayor tasa de falsos positivos
Puntuación de anomalías:
tx.sql_injection_score: acumula riesgo SQLi a través de múltiples reglastx.anomaly_score_pl3: alimenta la puntuación de anomalía total de CRS para PL3
Limitaciones de los WAF
Las reglas son la clave: los WAF son tan buenos como sus reglas. En modo log-only (frecuente por altos falsos positivos), ofrecen zero protección activa.
Sin comprensión de lógica de negocio: los WAF filtran sintaxis, no intención. No pueden detectar:
- IDOR:
GET /api/user/124(cambio de 123 a 124) — sin caracteres especiales, sin trigger - Authorization bypass:
/adminaccedido por un usuario sin privilegios — URL inofensiva - Race conditions / replay attacks: sin sintaxis maliciosa detectable
Tráfico cifrado como punto ciego: si el cifrado ocurre antes del WAF, este solo ve blobs cifrados. La terminación TLS en el WAF añade complejidad de gestión de certificados y posibles problemas de privacidad/compliance.
Ataques del lado del cliente invisibles: XSS DOM-based se ejecuta en el navegador y nunca llega al servidor. Scripts propios comprometidos (bibliotecas de analytics) no generan solicitudes sospechosas.
Nuevas superficies de ataque: reglas personalizadas mal configuradas pueden generar RCE (construcción dinámica de reglas ModSecurity sin escape correcto). Regex complejas + payloads grandes → DoS por agotamiento de memoria. La interfaz de administración expuesta puede ser atacada (e.g., CVE-2020-5902 en F5 BIG-IP).
Performance vs. seguridad: la DPI consume CPU. Regex en payloads grandes o decodificación multi-capa genera latencia. Los modelos de detección de anomalías son computacionalmente costosos a escala.
Principio rector
Un WAF correctamente configurado aumenta la seguridad y ayuda con el cumplimiento normativo. Pero un WAF nunca es un sustituto del código seguro. La ciberseguridad se construye mediante una política integral y múltiples capas de defensa.
Ver también
- WAF Bypass Techniques — evasión práctica de reglas CRS, encoding, truncación, protocol manipulation
- HTTP Request Smuggling — bypass de WAF via desincronización de parsers
- Vulnerability Chaining — encadenar WAF bypass con otras vulnerabilidades