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➡️/%61dmino/ad%6d%69n. - Doble:
.es%2e, en doble encode es%252e. Un traversal completo:%252e%252e%252f.
- Ejemplo:
- 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:
\u0061dmino codificado en la URL como%5cu0061dmin.
- Ejemplo:
- 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.- Referencia: UTF-8 Inconsistencies
B. Manipulación de Fragmentos (Hashtags #)
- Por estándar, el fragmento
#es procesado solo por el cliente. Sin embargo, al inyectar%23directamente 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%23de 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.
../admino/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).
- Caracteres clave:
- 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/publicse 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.
- Referencia: Sorosh IIS Auth Bypass
- Estructuras de Rutas en .NET: Variaciones en el manejo de directorios binarios o protegidos.
- Ejemplo:
https://victim.com/webform/(S(X))/prot/(S(X))ected/target1.aspx - Ejemplo:
https://victim.com/webform/(S(X))/b/(S(X))in/target2.aspx - Referencia: All is XSS that comes to the net - iSec
- Ejemplo:
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.1olocalhost) 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: /adminX-Rewrite-URL: /adminX-Overwrite-Path: /admin
- Fuzzing de Cabeceras de Host (Host Spoofing):
X-Forwarded-Host: 127.0.0.1X-Forwarded-Host: localhostX-Host: localhost
- Hacktricks we: HackTricks HTTP Headers Fuzzing
4. Desincronización y Caché (Request Smuggling)
- HTTP Request Smuggling: Aprovechar las diferencias entre el uso de
Content-LengthyTransfer-Encodingpara 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..csso.js).- Referencia: PortSwigger Research - Gotta Cache 'Em All
Recursos - Resumen
- Encodings (encode URL, double URL Encode, \u00 format, unicode normalization shit)
- Hashtags #
- Traversals(./, ../, ..;/, /->, //, ..;/)
- Trims/Removed Characters (ve el blog de rafa, space, tab, newlines, null bois, etc)
- Distintas perspectivas (SSRF, Se puede bypassear desde adentro de la red?)
- Headers para sobreescribir el Path
X-Ovewrite-path: - https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/403-and-401-bypasses#http-headers-fuzzing
- Cambiar el host header
- X-Forwarded-Host - X-header para cambiar host header
- Request Smuggling
- https://portswigger.net/research/gotta-cache-em-all
Tambien puedes bypassearlos con path traversal
../admin
/a/..%5cadmin
URL ENCODE
- JAVASCRIPT NOTATIONS -> \U0061
- JAVASCRIPT NOTATIONS -> %5cu0061
- https://bi.tk/utf8.html
Estructura general:
- Cuando buscamos 403 bypasses?
- Cuando estamos con: Reverse proxy/WAF environment
- Buscar researches de cómo bypassear ciertos casos
- Automatización con el Bebiks’ 403 Bypasser
Finalmente
Automatiza brother.