JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • Dato importante ⚠️
  • Ejemplo:
  • ¿Donde se almacenan entonces las contraseñas si no están en etc/passwd? →
  • Lectura de archivos arbitrarios mediante recorrido de ruta:
  • Obstáculos comunes para explotar las vulnerabilidades de recorrido de ruta
  • Path traversal anidados, o secuencias de recorridos de caminos diferentes →
  • A veces hacer más es hacer menos, si se va a hacer más debe hacerse completo → 😮
  • A veces no necesitamos más de lo que creemos →
  • Cambiar extensión requerida para un archivo desde la URL →
  • Forma de omitir la extensión desde la url →
  • Cómo prevenir un ataque de recorrido de ruta
  • ¿Qué significa canonicalizar una ruta?
  1. PortSwigger WebAcademy
  2. Server Side Topics

Path Traversal

En esta sección veremos la famosa vulnerabilidad conocida como path traversal, ¿que es?, ¿cómo se explota? ¿en que consiste? Y como se remedia, con ayuda de los laboratorios ofrecidos por Portswigger.

PreviousLaboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantesNextLaboratorio: File path traversal, simple case

Last updated 7 months ago

En esta sección veremos todo acerca del camino recorrido, dentro de las paginas web, ya antes lo había estudiado pero sin mucho detalle, ahora vamos a ver en profundidad esto.

Es cierto que las paginas web a día de hoy se protegen mucho más que en el pasado y es por ello que muchas sitios web ya vienen protegidos contra ataques del tipo SQL injection, Cookies, authentication, bypass 2FA etc. y sobre todo también Path traversal y en esta ocasión lo veremos.

  • Entonces veremos:

    1. Que es un path traversal o recorrido de camino.

    2. Como sortear y atacar sitios web por este modo de ataque.

    3. Como prevenir este tipo de vulnerabilidad en los sitios web.


El path traversal también se conoce como recorrido de directorios, donde se pueden listar directorios diversos que tiene un aplicativo web alojados en el servidor que es el que ejecuta la aplicación, los directorios que se pueden encontrar pueden ser diversos tales como:

  1. Códigos y datos de aplicación.

  2. Credenciales para Sistemas Backend

  3. Archivos sensibles del Sistema Operativo

Y esto puede ser grave porque en ciertos casos el atacante (yo) puedo tomar y modificar ciertos archivos arbitrarios que se pueden desplegar del servidor cambiando la logica de ciertos archivos para cambiar en algunos casos el comportamiento de la aplicacion haciendo que pueda tomar total control.

  • El ../../ es el directorio root como ya sabemos, donde puede estar etc/passwd or etc/passwords, etc…

    • Además cabe aclarar que en los sistemas operativos UNIX systems, el Etc/passwd es el directorio estandar donde se guardan ciertas credenciales de users del SO

  • El ../ es más simple podemos encontrar el directorio var con las imagenes dentro de www/

En Windows 🤮

  • Existe el archivo de inicialización de ciertos archivos que se hace llamar como win.ini, donde hay variedad de diversos archivos o directorios los cuales se inicializan en cuanto el SO inicia.

Dato importante ⚠️

Ejemplo:

La línea que proporcioné del archivo /etc/passwd tiene el siguiente formato:

carlos:x:12002:12002::/home/carlos:/bin/bash

Vamos a analizar cada uno de los campos:

  1. Nombre de usuario (carlos): Este es el nombre de inicio de sesión del usuario. En tu ejemplo, el nombre de usuario es "carlos".

  2. Contraseña (x): Al igual que en el ejemplo anterior, el campo de contraseña se establece en "x", indicando que la contraseña está almacenada de forma segura en otro lugar.

  3. ID de usuario (12002): Este es el número único que identifica al usuario en el sistema. En tu ejemplo, el ID de usuario es "12002".

  4. ID de grupo principal (12002): Este es el ID de grupo principal al que pertenece el usuario. En este caso, el usuario "carlos" pertenece al grupo con ID "12002".

  5. Descripción del usuario ((ninguna)): Este campo está vacío, indicando que no hay una descripción específica proporcionada para el usuario.

  6. Directorio de inicio (/home/carlos): Este es el directorio inicial o directorio de inicio del usuario. Cuando el usuario "carlos" inicia sesión, se coloca automáticamente en este directorio. En tu ejemplo, el directorio de inicio es "/home/carlos".

  7. Shell del usuario (/bin/bash): Este es el programa que se ejecuta cuando el usuario inicia sesión. En este caso, el shell es "/bin/bash", que es el shell de Bash.

En resumen, la línea representa al usuario "carlos" en el sistema. Su ID de usuario es 12002, pertenece al grupo principal con ID 12002, su directorio de inicio es "/home/carlos", y el shell predeterminado es Bash ("/bin/bash"). La contraseña real no se almacena directamente en este archivo, ya que el campo de contraseña se establece en "x".

¿Donde se almacenan entonces las contraseñas si no están en etc/passwd? →

Explicación:

  • /etc/passwd contiene información básica de los usuarios del sistema (nombre de usuario, UID, GID, etc.), pero no guarda las contraseñas directamente. En su lugar, contiene un marcador (generalmente x o *) para indicar que las contraseñas se encuentran en otro archivo más seguro.

  • /etc/shadow es donde realmente se almacenan las contraseñas, en forma de hashes. Este archivo es accesible solo por el usuario root para evitar accesos no autorizados y proteger la seguridad de las contraseñas.

El sistema de autenticación revisa /etc/shadow para verificar las contraseñas al inicio de sesión, comparando el hash ingresado con el almacenado.


Lectura de archivos arbitrarios mediante recorrido de ruta:

Podemos imaginar una aplicación que tenga diversos posts con imagenes, podemos ver la imagen que se carga de un post x, desde html del tipo:

<img src="/loadImage?filename=218.png">

Bueno, ¿y esta como lo podemos ver desde un recorrido de caminos path traversal?

Supongamos que la ruta donde está la imagen 218.png está dentro del directorio www/images/218.png ahora, para devolver una imagen, la aplicación agrega el nombre de archivo solicitado a este directorio base y utiliza una API del sistema de archivos para leer el contenido del archivo. En otras palabras, la aplicación lee la siguiente ruta de archivo:

/var/www/images/218.png

En este caso suponemos que la aplicación no implementa defensas contra los path traversal así que, como consecuencía uno de atacante puede obtener la ruta más importante de directorios del server que podría ser /etc/passwd/ →

https://insecure-website.com/loadImage?filename=../../../etc/passwd

  • Esto hace que la aplicación lea desde la siguiente ruta de archivo:

/var/www/images/../../../etc/passwd

Así es como se leería la ruta del archivo, sin embargo podemos tomar otras lecturas también de otros servers como en windows por ejemplo:

<https://insecure-website.com/loadImage?filename=>..\\..\\..\\windows\\win.ini

Ahi lo tenemos, es claro que se puede navegar entre directorios en windows tanto como “../” pero también podriamos del tipo “..\” ambos son equivalentes y validos.

  • Ahora bien vamos a ver el primer laboratorio para probar como sería un recorrido de camino y ver que tal:


Obstáculos comunes para explotar las vulnerabilidades de recorrido de ruta

  • A veces las aplicaciones digamos que si implementan defensas para los ataques de recorrido de directorios o path traversal, sin embargo muchas veces no tienen en cuenta las formas en las cuales se pueden saltar u omitir estas defensas, en esta ocasión veremos una de ellas, la cual es:

    • Mantener una dirección absoluta raiz del directorio, por ejemplo:

      • Tenemos una pagina http://sindominio.com/ejemplo/imagenes/loadImage?filename= y en vez de pasar el path traversal directamente lo que hacemos es pasarle la dirección raiz absoluta así:

      • http://sindominio.com/ejemplo/imagenes/loadImage?filename=>)=/etc/passwd/Y digamos que en cierta manera esta es una forma de saltar u omitir esta defensa que las paginas mantienen.

Vamos a resolver un laboratorio de ejemplo →


Path traversal anidados, o secuencias de recorridos de caminos diferentes →

  • También podemos llegar a hacer recorridos de caminos anidados sin recursividad directamente, en este caso lo hacemos de esta forma, vamos a ver:

    • …./ /

    • ….\ /

    Y estas secuencias así vuelven a secuencias transversales simples cuando se elimina la secuencia interna, osea que en resumen se interpretan de la misma forma que la secuencia transversal clasica.


A veces hacer más es hacer menos, si se va a hacer más debe hacerse completo → 😮

A veces basta simplemente con codificar la secuencia transversal para bypassear la seguridad de la aplicación web, porque pasa mucho que las aplicaciones a veces intentan proteger la url a ataques path traversal, el problema es que uno puede codificar la secuencia transveral y de esa forma la pagina si la lee como si nada normal.

A veces no necesitamos más de lo que creemos →

  • Por ejemplo a veces realmente para poder acceder nosotros a un archivo especifico como puede ser passwd, necesitamos el directorio de base para poder acceder por ejm que podría ser var/www/images por ejm.

Aqui podemos ver como ya tenemos el directorio base para poder acceder a la imagen, sin embargo lo que no tienen en cuenta los desarrolladores es que nosotros como atacantes ya no están dando un indicio una parte para termina la secuencia transversal, en este caso solo sería añadir lo restante que es etc/passwd

  • Así y lo resolvimos.


Cambiar extensión requerida para un archivo desde la URL →

  • A veces se necesita o se requiere que el nombre de un archivo tenga una extensión especifica como .png por ejm, entonces en ese caso si nosotros queremos hacer un path traversal que nos tome el passwd se supone que la aplicación no nos dejaría porque solo acepta que el final termine con una extensión especifica, pues bueno hay una forma de omitir ello.

Forma de omitir la extensión desde la url →

  • Para este caso lo que podemos hacer es añadir el %00 que es un byte nulo para terminar la ruta del archivo antes que la extensión requerida, ¿me hago entender?

    • Entonces en este caso podemos añadir eso a nuestro path traversal que hace que solo tengamos nuestro path traversal y entonces de esa forma validamos el path traversal sin que haya obligatoriamente una extensión al final de la ruta.

    • Ejm: filename=../../../etc/passwd%00.png


Cómo prevenir un ataque de recorrido de ruta

  • La forma más eficaz de evitar esto es haciendo que la entrada proporcionada por el usuario no entre en contacto directo con la API del sistema de archivos, lo mejor en esta via es evitar entrada por parte del usuario a las API del sistema de archivos, y si no es posible evitar esto, hacer lo siguiente: (Se recomienda utilizar dos capas de defensa para evitar ataques)

    • Valide la entrada del usuario antes de procesarla. Lo ideal es comparar la entrada del usuario con una lista blanca de valores permitidos. Si eso no es posible, verifique que la entrada contenga solo contenido permitido, como caracteres alfanuméricos únicamente.

    • Después de validar la entrada proporcionada, agregue la entrada al directorio base y use una API del sistema de archivos de la plataforma para canonicalizar la ruta. Verifique que la ruta canonicalizada comience con el directorio base esperado.

    Aqui muestro un ejemplo de código Java simple para validar la ruta canónica de un archivo según la entrada del usuario:

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}

¿Qué significa canonicalizar una ruta?

Canonicalizar una ruta significa convertirla a su forma estándar o absoluta, eliminando cualquier ambigüedad o redundancia en el camino especificado. Este proceso incluye:

  1. Eliminar referencias relativas, como . (el directorio actual) y .. (el directorio padre).

  2. Convertir una ruta relativa en absoluta, usando la ubicación actual como base si es necesario.

  3. Resolver enlaces simbólicos (symlinks), de forma que la ruta final apunte al verdadero destino en el sistema de archivos.

Por ejemplo, si tienes la ruta ./docs/../files/./images, la versión canonicalizada sería /home/usuario/files/images, asumiendo que estás en /home/usuario.

Eso es todo por path traversal. :)

En Linux

🍏
web academy portswigger
Lab of Portswigger Academy