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