¿Y si la web te deja leer cualquier archivo del servidor?

Path Traversal te permite salir de la carpeta donde debería estar atrapado un archivo y leer cualquier otro archivo del servidor. Con tres puntos y una barra, basta.

⚡ Ir al laboratorio (puede tardar en levantarse)

Lo que necesitas: un navegador. Nada más.


¿Qué es Path Traversal?

Muchas webs cargan archivos a partir de un nombre que tú le pasas. Por ejemplo, para mostrar el manual de un producto:

https://web.com/ver?archivo=manual.pdf

El servidor coge manual.pdf, lo busca dentro de su carpeta de documentos, y te lo muestra.

El problema: si el servidor no comprueba que el nombre que le pasas se queda dentro de esa carpeta, puedes usar ../ para salir de ella. ../ significa “sube una carpeta” en Linux y Windows. Si encadenas varios, puedes llegar hasta la raíz del sistema y leer cualquier archivo del servidor — contraseñas, configuración, código fuente.

Eso es Path Traversal, también llamado LFI (Local File Inclusion — inclusión de archivo local).


¿Cómo se explota?

Paso 1 — identifica el parámetro

Busca en la URL algo que pida un nombre de archivo: ?archivo=, ?file=, ?doc=, ?page=, ?img=. Cualquier parámetro que cargue contenido es sospechoso.

Paso 2 — prueba a subir un nivel

Cambia el valor por algo con ../:

?archivo=../config.txt

Si el servidor responde con un error revelando la ruta interna, o si ves contenido que no esperabas, vas por buen camino.

Paso 3 — sube hasta la raíz

Normalmente hace falta subir varios niveles para salir de la carpeta del proyecto. Prueba con varios ../ seguidos:

?archivo=../../../../etc/passwd

/etc/passwd es un archivo de Linux que lista los usuarios del sistema. Es el objetivo clásico para confirmar que el ataque funciona — si lo ves, tienes acceso a leer archivos del servidor.

No sabes cuántos niveles hay que subir, así que prueba con varias cantidades: 2, 4, 6, 8 veces ../. Una de ellas acertará.

Paso 4 — si lo bloquea, codifícalo

Algunos servidores buscan literalmente el texto ../ y lo bloquean. Pero se puede escribir de otra forma que significa lo mismo para el servidor pero no para el filtro. Esto se llama codificación URL — convertir caracteres en su versión %XX:

..%2f..%2f..%2f..%2fetc/passwd

%2f es la barra / codificada. Si el filtro solo busca / literal, esto lo esquiva.

Paso 5 — en Windows el objetivo cambia

Si el servidor es Windows en vez de Linux, el archivo equivalente para confirmar el ataque es:

?archivo=../../../../windows/win.ini

🎯 Tu reto

Consigue leer el contenido de /etc/passwd a través del parámetro vulnerable del laboratorio.


🛡️ Cómo se protege

Nunca confiar en el nombre de archivo que manda el usuario. En vez de eso, usar un identificador (como un número) y mapearlo internamente a la ruta real:

# ❌ Vulnerable — usa directamente lo que manda el usuario
ruta = "/var/docs/" + request.args.get("archivo")

# ✅ Seguro — solo permite IDs de una lista controlada
ARCHIVOS = {"1": "manual.pdf", "2": "garantia.pdf"}
ruta = "/var/docs/" + ARCHIVOS.get(request.args.get("id"), "")

Si hace falta aceptar nombres de archivo, comprobar que la ruta final sigue dentro de la carpeta permitida, usando funciones que resuelven la ruta real y la comparan:

import os

base = os.path.realpath("/var/docs")
ruta = os.path.realpath(os.path.join(base, nombre_archivo))

if not ruta.startswith(base):
    # Alguien intentó salir de la carpeta — bloquear
    abort(403)

Eliminar secuencias peligrosas antes de usar el nombre, aunque esto por sí solo no es suficiente — siempre combinarlo con la comprobación anterior.


// ¿te has atascado?

🔒

Ver solución paso a paso

Haz clic para revelar

  1. Busca un parámetro en la URL que cargue un archivo: ?archivo=, ?file=, ?doc=.
  2. Prueba: ?archivo=../../../../etc/passwd
  3. Si no funciona, prueba con menos o más niveles: ../etc/passwd, ../../etc/passwd, ../../../../../etc/passwd.
  4. Si el servidor lo bloquea, codifica las barras: ..%2f..%2f..%2f..%2fetc/passwd
  5. Cuando veas una lista de usuarios tipo root:x:0:0:..., has leído /etc/passwd con éxito.