// decía otra cosa. Cómo el Vigía de Amenazas cazó —en menos de 5 minutos y a través de dos cambios de técnica— a un corsario que esquivaba las restricciones por IP con doble slash y encoding unicode, y automatizó el abordaje en el WAF.198.51.100.0/24,
203.0.113.0/24) y las rutas son genéricas (/admin, /api/registro).
Una restricción de acceso que confiaba en el path tal cual llegaba.
El cliente protegía dos superficies sensibles —su API interna y su portal de administración— con reglas de WAF basadas en IP de origen + ruta: /admin y /api/* solo se servían a IPs de la lista permitida. Para todos los demás, el WAF respondía 403.
El supuesto frágil: que la ruta que evalúa el WAF es la misma que finalmente resuelve el servidor de origen. No lo es. El WAF comparaba la cadena literal del path; el origen normalizaba esa cadena antes de enrutarla. Ese desajuste —regla sobre el texto crudo, enrutamiento sobre el texto normalizado— es toda la vulnerabilidad.
/admin pero deja pasar //admin no está protegiendo la ruta:
está protegiendo una forma de escribirla. El origen colapsa // a / y sirve el recurso —con 200 OK—. El vigía del WAF nunca llegó a verlo como un abordaje a administración.
Dos fases, dos técnicas, dos IPs. La misma intención.
198.51.100.0/24, el atacante prueba prefijos de slash sobre rutas bloqueadas. /admin devuelve 403; //admin devuelve 200 OK. El borde evalúa la cadena literal; el origen la normaliza. La restricción por IP queda anulada.//api/registro: alta de cuentas en lote, a un ritmo y regularidad imposibles para un humano, sin el patrón de navegación previo (login, carga de assets, formularios) que precede a un alta legítima.// se colapsa a / antes de aplicar la lista de acceso.203.0.113.0/24), el atacante reintenta con el slash codificado: /%2F%2Fadmin, overlong encoding y variantes de representación del separador, para esquivar la flamante regla de doble slash literal.# Lo que evaluaba la regla (texto crudo) → lo que servía el origen (normalizado) GET /admin → WAF: 403 Forbidden # bloqueado correctamente GET //admin → WAF: 200 OK # Fase 1: doble slash colapsado en el origen GET /%2F%2Fadmin → WAF: 200 OK # Fase 2: separador URL-encoded GET /%c0%afadmin → WAF: 200 OK # Fase 2: overlong encoding del '/' # La corrección: normalizar ANTES de decidir path = url_decode(raw_path) # resuelve %2F, overlong, etc. path = collapse_slashes(path) # // /// → / if matches_protected(path) and ip not in allowlist: return 403 # ahora sí, sobre la ruta real
Caza por comportamiento sobre rutas protegidas y vulnerabilidades conocidas.
Un WAF tradicional bloquea lo que reconoce: una firma, un patrón conocido. El bypass por doble slash no dispara ninguna firma —es un GET perfectamente formado que devuelve 200—. El Vigía de Amenazas no pregunta "¿esto coincide con un ataque conocido?", sino "¿este comportamiento tiene sentido sobre esta superficie?".
/admin o API interna, sin estar en la lista permitida.Construido sobre tecnologías cloud-native, serverless y de bajo costo operativo en AWS.
| Sin el Vigía | Con SecMon |
|---|---|
| El bypass (200 OK) no dispara ninguna firma del WAF | Detectado por comportamiento en <5 min del primer request |
| Cambiar de técnica (unicode) reinicia el reloj del atacante | La Fase 2 alertó igual: misma intención, sin firma nueva |
| La regla parchea la cadena de hoy, no la clase de ataque | Corrección de raíz: normalizar el path antes de evaluar |
| Cuentas fraudulentas descubiertas días después, si acaso | Auditadas y eliminadas el mismo día del incidente |
| Respuesta manual, dependiente de que alguien mire los logs | De la alerta al bloqueo en WAF en minutos |
/admin pero no //admin ni /%2F%2Fadmin, no estás bloqueando la ruta: estás bloqueando una forma de escribirla.// y dejar abierto %2F%2F es jugar al whack-a-mole. La regla correcta cubre la categoría de bypass (URL-encoding, overlong, variantes del separador), no la cadena puntual de hoy.Lo revisamos sobre tus propios logs: te mostramos si //admin o /%2F%2Fadmin esquivan tus restricciones, y qué comportamiento estás dejando navegar hoy. Sin tocar tu infraestructura — solo lectura.