Proxy / WAF Protections Bypass
Bypass de Reglas de ACL de Nginx con Manipulación de Rutas
Técnicas de esta investigación.
Ejemplo de regla de Nginx:
En orden de prevenir los bypasses Nginx realiza una normalización de ruta antes de verificarla. Sin embargo, si el servidor backend realiza una normalización diferente (eliminando caracteres que Nginx no elimina) podría ser posible evadir esta defensa.
NodeJS - Express
Flask
Spring Boot
PHP-FPM
Configuración de Nginx FPM:
Nginx está configurado para bloquear el acceso a /admin.php
pero es posible evitar esto accediendo a /admin.php/index.php
.
Cómo prevenir
Saltar Reglas de Mod Security
Confusión de Ruta
En esta publicación se explica que ModSecurity v3 (hasta la versión 3.0.12), implementó de manera incorrecta la variable REQUEST_FILENAME
que se suponía que contenía la ruta de acceso (hasta el inicio de los parámetros). Esto se debió a que realizaba un descodificación de URL para obtener la ruta.
Por lo tanto, una solicitud como http://example.com/foo%3f';alert(1);foo=
en ModSecurity supondrá que la ruta es solo /foo
porque %3f
se transforma en ?
finalizando la ruta de URL, pero en realidad la ruta que recibirá el servidor será /foo%3f';alert(1);foo=
.
Las variables REQUEST_BASENAME
y PATH_INFO
también se vieron afectadas por este error.
Algo similar ocurrió en la versión 2 de Mod Security que permitía saltar una protección que impedía que el usuario accediera a archivos con extensiones específicas relacionadas con archivos de respaldo (como .bak
) simplemente enviando el punto codificado en URL en %2e
, por ejemplo: https://example.com/backup%2ebak
.
Saltar AWS WAF ACL
Encabezado Malformado
Esta investigación menciona que era posible saltar las reglas de AWS WAF aplicadas sobre los encabezados HTTP enviando un encabezado "malformado" que no era analizado correctamente por AWS pero sí por el servidor backend.
Por ejemplo, enviando la siguiente solicitud con una inyección SQL en el encabezado X-Query:
Fue posible evadir AWS WAF porque no entendía que la siguiente línea formaba parte del valor del encabezado mientras que el servidor NODEJS sí lo hacía (esto fue corregido).
Referencias
Última actualización