Cómo una simple coma colapsó una industria de seguridad valorada en miles de millones
Investigadores de Ethiack durante pruebas autónomas de protección encontraron un método para evadir incluso los cortafuegos de aplicaciones web más estrictos mediante una técnica inusual: la inyección de JavaScript a través de la contaminación de parámetros HTTP. Como objetivo de prueba se utilizó una aplicación ASP.NET con reglas de filtrado lo más estrictas posible. Cualquier intento de inyectar construcciones XSS estándar fue bloqueado, sin embargo, gracias a las particularidades del manejo de parámetros duplicados los investigadores lograron ensamblar una carga útil funcional que el cortafuegos ni siquiera detectó.
La clave para eludirlo fue que el método ASP.NET HttpUtility.ParseQueryString() concatena parámetros idénticos separados por comas. Así, una cadena de consulta del tipo q=1'&q=alert(1)&q='2 se convierte en la secuencia 1',alert(1),'2. Al insertarlo en JavaScript esto se transforma en jsuserInput = '1',alert(1),'2; — es decir, el código pasa a ser sintácticamente válido, y el operador coma ejecuta la llamada alert. Este comportamiento permite repartir fragmentos maliciosos entre varios parámetros y eludir las comprobaciones basadas en firmas clásicas. Mientras que ASP.NET y el ASP clásico concatenan los valores, otras plataformas como Golang o Python Zope tratan los parámetros como matrices, por lo que la técnica no es aplicable en todos los entornos.
Para comprobar la resistencia se probaron diecisiete configuraciones de distintos fabricantes: AWS WAF, Google Cloud Armor, Azure WAF, open-appsec, Cloudflare, Akamai, F5, FortiWeb y NGINX App Protect. Se aplicaron cuatro tipos de cargas — desde una inyección simple del tipo q=';alert(1), hasta variantes más complejas con separadores y evasiones heurísticas. Solo Google Cloud Armor con ModSecurity, Azure WAF Default Rule Set 2.1 y todos los niveles de sensibilidad de open-appsec lograron bloquear por completo todas las variantes. Mientras tanto, AWS WAF, F5 y las soluciones de Cyber Security Cloud fallaron en todos los escenarios. El porcentaje general de evasiones aumentó de 17,6% para la consulta de inyección básica a 70,6% para la contaminación de parámetros avanzada.
El hackbot autónomo utilizado por los investigadores también logró encontrar evasiones para soluciones que habían resistido las pruebas manuales. En Azure WAF se pudo aprovechar un manejo inconsistente de caracteres escapados mediante la secuencia test\';alert(1);//. En open-appsec la herramienta en medio minuto encontró una variante funcional incluso para el perfil «crítico», variando llamadas desde alert hasta confirm y pasando a construcciones más ingeniosas como q='+new Function('a'+'lert(1)')()+'. En Google Cloud Armor no fue posible eludir el filtrado, pero el análisis mostró que la lógica del servidor es sensible al uso de mayúsculas y minúsculas en los parámetros, lo que podría abrir puertas en el futuro.
Los resultados subrayan las limitaciones sistémicas de los WAF basados en firmas e incluso heurísticos. Detectar de forma completa los ataques repartidos entre parámetros requeriría un entendimiento profundo de la lógica del marco específico y análisis en el contexto de JavaScript, lo que es difícil de implementar a nivel de proxy. Los intentos de aplicar aprendizaje automático tampoco garantizan resistencia, ya que los bots adaptativos se ajustan rápidamente y encuentran patrones seguros para ellos.
En conclusión, los investigadores recuerdan que los cortafuegos no pueden ser la única barrera: se necesitan validación de entradas, escape correcto y prácticas de desarrollo fiables. La combinación del enfoque creativo humano y las herramientas automatizadas demuestra lo rápido que incluso las vulnerabilidades atípicas pueden descubrirse y por qué la verificación continua sigue siendo obligatoria.