Saltar al contenido principal

403 Bypass

Importante

  • No siempre se va a poder bypassear deben existir circunstancias especificas

  • Hay que entender cuando tenemos un 403 en una aplicación y cuando tenemos uno en un reverse proxy

  • En este caso nos debemos enfocar en los reverse proxys.

  • Hay veces es que en las empresas pasan por procesos y le dicen al dev oye dev quita "/admin" y el dev dice no we es que no puedo porque constantemente lo uso, entonces se setean esos reverse proxies para que cuando un usuario comun y corriente quiera acceder le regrese un 403 a pesar de que el back le está dando un 200.

Ejemplos de 403 ¿Default?:

Nginx

Apache

IIS

Esto pasa con los WAF y con los reverse proxies o sea la respuesta es distinta cuando es un forbidden de akamai o aws o que cuando es por parte del frontend

SI TIENES PURO 403 probablemente sea una whitelist que tenga el reverse proxy

Formas de bypassear

A. Encodings e Inconsistencias Unicode

  • URL Encode / Double URL Encode: Útil cuando el WAF solo decodifica una capa pero el backend procesa dos.
    • Ejemplo: /admin ➡️ /%61dmin o /ad%6d%69n.
    • Doble: . es %2e, en doble encode es %252e. Un traversal completo: %252e%252e%252f.
  • Notaciones de Lenguaje (JS / .NET): Pasar caracteres utilizando secuencias de escape literales que el proxy no interpreta como texto plano pero el backend sí procesa.
    • Ejemplo: \u0061dmin o codificado en la URL como %5cu0061dmin.
  • Normalización Unicode (Unicode Normalization): Aprovechar la conversión de caracteres visualmente similares (homóglifos) que el servidor backend transforma en caracteres estándar (NFC/NFKC) después de pasar la validación del proxy.

B. Manipulación de Fragmentos (Hashtags #)

  • Por estándar, el fragmento # es procesado solo por el cliente. Sin embargo, al inyectar %23 directamente en herramientas de red o scripts, algunos proxies dividen la cadena y cortan la validación en ese punto, mientras que ciertos backends (como Node.js o Python) pueden interpretar el %23 de forma literal, alterando el enrutamiento lógico interna.

C. Directory Traversals y Normalización de Puntos

El objetivo es fusionar segmentos de rutas públicas con las restringidas para confundir al parser.

  • ../admin o /public/../admin
  • /a/..%5cadmin (Uso de barra invertida \ para confundir WAFs basados en Linux cuando el destino final es Windows/IIS).
  • ..;/ (El truco clásico de Tomcat/Nginx: el proxy detiene el análisis en el ; considerándolo un parámetro de matriz válido, pero el backend lo remueve y ejecuta el salto de directorio).

D. Remoción de Caracteres y Trims (Inconsistencias de Parsers)

Basado en cómo las funciones trim() o strip() difieren entre el código del proxy (como Nginx escrito en C) y los lenguajes del backend (Java, Python, JavaScript).

  • Whitespace Fuzzing: Inyección de caracteres invisibles al inicio o final de la ruta que el proxy ignora (creyendo que busca /admin%20) pero el backend remueve automáticamente antes de mapear el endpoint.
    • Caracteres clave: %20 (Espacio), %09 (Tab), %0a (\n), %0d (\r), %85 (Next Line), %a0 (Non-breaking space).
  • Null Bytes (%00 / "Null Bois"): Terminadores de cadena en entornos C/C++ o PHP antiguo. Hacen que el backend procese la cadena truncada (ej. /admin%00/public se ejecuta como /admin).

E. Casos Especiales e Investigaciones Históricas

  • Duodrop IIS (CVE-2023-36899): Inconsistencias específicas de autenticación en ASP.NET Framework sin cookies combinadas con escalada de privilegios en Application Pools.
  • Estructuras de Rutas en .NET: Variaciones en el manejo de directorios binarios o protegidos.

3. Perspectivas de Red y Cabeceras HTTP

A. Diferentes Ángulos de Red

  • SSRF (Server-Side Request Forgery): Forzar al servidor a realizar la petición desde su propia interfaz de bucle de retorno (127.0.0.1 o localhost) para saltar las reglas perimetrales del proxy.
  • Perspectiva Interna: Acceder o enviar peticiones simulando estar en un segmento de red diferente (o una subred de confianza interna) donde las restricciones 403 suelen estar desactivadas por defecto.

B. Cabeceras para Sobreescribir el Path y el Host

Inyectar metadatos en los encabezados HTTP para forzar al proxy o al backend a reescribir el destino de la solicitud.

  • Fuzzing de Cabeceras de Ruta:
    X-Original-URL: /admin
    X-Rewrite-URL: /admin
    X-Overwrite-Path: /admin
  • Fuzzing de Cabeceras de Host (Host Spoofing):
    X-Forwarded-Host: 127.0.0.1
    X-Forwarded-Host: localhost
    X-Host: localhost

4. Desincronización y Caché (Request Smuggling)

  • HTTP Request Smuggling: Aprovechar las diferencias entre el uso de Content-Length y Transfer-Encoding para contrabandear una petición oculta que el proxy no analiza, pero que el backend ejecuta localmente.
  • Gotta Cache 'Em All (PortSwigger): Ataques dirigidos a la desincronización de los componentes de caché web. Al forzar discrepancias de delimitadores (?, ;, #) o normalizaciones erróneas de puntos, se puede engañar a la caché para que almacene una respuesta de administración confidencial (403 original para el público) bajo una extensión estática pública (ej. .css o .js).

Recursos - Resumen

Tambien puedes bypassearlos con path traversal

../admin
/a/..%5cadmin

URL ENCODE

Estructura general:

  1. Cuando buscamos 403 bypasses?
  2. Cuando estamos con: Reverse proxy/WAF environment
  3. Buscar researches de cómo bypassear ciertos casos
  4. Automatización con el Bebiks’ 403 Bypasser

Finalmente

Automatiza brother.