hacktricks/pentesting-web/proxy-waf-protections-bypass.md

7.4 KiB

Bypass de Protecciones de Proxy / WAF

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

{% embed url="https://websec.nl/" %}

Bypass de Reglas de ACL de Nginx con Manipulación de Rutas

Técnicas de esta investigación.

Ejemplo de regla de Nginx:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

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

Versión Nginx Caracteres de Bypass en Node.js
1.22.0 \xA0
1.21.6 \xA0
1.20.2 \xA0, \x09, \x0C
1.18.0 \xA0, \x09, \x0C
1.16.1 \xA0, \x09, \x0C

Flask

Versión Nginx Caracteres de Bypass en Flask
1.22.0 \x85, \xA0
1.21.6 \x85, \xA0
1.20.2 \x85, \xA0, \x1F, \x1E, \x1D, \x1C, \x0C, \x0B
1.18.0 \x85, \xA0, \x1F, \x1E, \x1D, \x1C, \x0C, \x0B
1.16.1 \x85, \xA0, \x1F, \x1E, \x1D, \x1C, \x0C, \x0B

Spring Boot

Versión Nginx Caracteres de Bypass en Spring Boot
1.22.0 ;
1.21.6 ;
1.20.2 \x09, ;
1.18.0 \x09, ;
1.16.1 \x09, ;

PHP-FPM

Configuración de Nginx FPM:

location = /admin.php {
deny all;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

Nginx está configurado para bloquear el acceso a /admin.php pero es posible evitar esto accediendo a /admin.php/index.php.

Cómo prevenir

location ~* ^/admin {
deny all;
}

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:

GET / HTTP/1.1\r\n
Host: target.com\r\n
X-Query: Value\r\n
\t' or '1'='1' -- \r\n
Connection: close\r\n
\r\n

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

{% embed url="https://websec.nl/" %}

Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: