Path Traversal: Acceso no Autorizado a Archivos y Directorios

La vulnerabilidad **Path Traversal**, también conocida como "Directory Traversal" o "../ attack", permite a un atacante acceder a archivos y directorios almacenados fuera del directorio raíz de la aplicación web. Al manipular las rutas de archivo en los parámetros de entrada, un atacante puede leer, y en algunos casos escribir o ejecutar, archivos sensibles del servidor o de otras partes del sistema de archivos, lo que puede llevar a una divulgación de información crítica o incluso a la ejecución remota de código.
¿Cómo Funciona Path Traversal?
Esta vulnerabilidad surge cuando una aplicación web utiliza la entrada del usuario para construir rutas de archivo sin una validación o saneamiento adecuado. El atacante inserta secuencias de caracteres como `../` (punto-punto-barra) en la entrada para navegar a directorios padre y así acceder a ubicaciones fuera del ámbito previsto de la aplicación.
Por ejemplo, si una aplicación utiliza un parámetro para cargar una imagen:
http://ejemplo.com/mostrar_imagen?archivo=banner.jpg
Internamente, el servidor podría construir una ruta como: `/var/www/html/imagenes/banner.jpg`.
Un atacante podría modificar la URL para intentar acceder a un archivo sensible del sistema:
http://ejemplo.com/mostrar_imagen?archivo=../etc/passwd
Si la aplicación es vulnerable, podría construir la ruta: `/var/www/html/imagenes/../etc/passwd`, lo que se resuelve a `/var/www/html/etc/passwd` y luego a `/etc/passwd`, permitiendo al atacante leer el archivo de contraseñas de Linux.
Variaciones del Ataque Path Traversal
Los atacantes pueden emplear varias técnicas para evadir los filtros básicos:
- **Codificación URL:** `..%2f` (donde `%2f` es la codificación URL de `/`).
- **Codificación Unicode:** `..%c0%af` o `..%252f` (doble codificación).
- **Uso de barras invertidas:** `..\` en sistemas Windows.
- **Falsos directorios:** `/etc/passwd/../../../../etc/passwd` (para sistemas que normalizan la ruta antes de la validación).
- **Truncamiento de bytes nulos:** `../etc/passwd%00.jpg` (si la aplicación trunca la cadena en el byte nulo).
Impacto de Path Traversal
Las consecuencias de una vulnerabilidad Path Traversal pueden ser significativas:
- **Divulgación de información sensible:** Lectura de archivos de configuración, código fuente de la aplicación, logs del servidor, credenciales o datos de usuarios.
- **Manipulación de archivos:** En casos donde la aplicación permite escritura, un atacante podría sobrescribir o crear archivos, lo que podría llevar a la desfiguración del sitio web o la ejecución remota de código si se combinan con otras vulnerabilidades (ej. carga de archivos).
- **Acceso a la configuración del sistema:** Obtención de información sobre la estructura interna del servidor.
Prevención de Path Traversal
La clave para prevenir Path Traversal es nunca confiar en la entrada del usuario para construir rutas de archivo y aplicar una validación estricta y lógica de saneamiento:
- **Validación Robusta de Entrada:**
No permitir caracteres como `.` `..` o `/` en los nombres de archivo proporcionados por el usuario. La validación debe ser por "lista blanca" (whitelist), permitiendo solo los caracteres conocidos y seguros, como caracteres alfanuméricos y guiones.
- **Normalización de Rutas antes de la Validación:**
Antes de cualquier validación, normalizar la ruta de entrada para resolver todas las secuencias `../` y `.` y cualquier codificación URL. Esto asegura que la validación se realice sobre la ruta final real y no sobre una forma ofuscada.
// Pseudocódigo: String sanitizedPath = normalize(userInputPath); if (sanitizedPath.contains("../")) { // DENIEGAR }
- **Restricción del Alcance de Archivos:**
Si la aplicación debe servir archivos basados en la entrada del usuario, asegúrate de que el usuario solo pueda seleccionar entre una lista predefinida de archivos permitidos o que el archivo se sirva desde un directorio seguro y fijo, sin permitir la construcción dinámica de rutas.
// Pseudocódigo: String baseDir = "/var/www/html/archivos_publicos/"; String requestedFile = validate_filename(userInputFilename); // solo el nombre, no la ruta String fullPath = baseDir + requestedFile; // Asegurarse de que fullPath está dentro de baseDir antes de abrirlo
- **Uso de Entornos con Privilegios Mínimos (Chroot Jails):**
Configurar el servidor web o el proceso de la aplicación para que se ejecute dentro de un entorno chroot (jaula), lo que restringe su acceso al sistema de archivos a un subdirectorio específico y evita que pueda navegar más allá de él.
- **Control de Acceso (Permisos de Archivo):**
Asegurarse de que incluso si un atacante logra acceder a un archivo fuera del directorio web, los permisos del sistema operativo (Linux/Unix) o del sistema de archivos (NTFS en Windows) impidan su lectura o escritura.
Consideraciones Éticas
Este artículo tiene fines educativos y de concienciación sobre las vulnerabilidades de seguridad web. La manipulación de rutas de archivo y el intento de acceder a recursos sin autorización en sistemas ajenos es ilegal y puede tener graves consecuencias legales. Utiliza estos conocimientos de manera responsable y ética, siempre en entornos controlados y con el permiso explícito del propietario del sistema.
¿Has encontrado alguna vez una vulnerabilidad de Path Traversal en tus proyectos o durante un pentesting? ¡Comparte tu experiencia y consejos de prevención!
La implementación de defensas contra Path Traversal requiere un diseño cuidadoso y pruebas exhaustivas, especialmente en aplicaciones que manejan dinámicamente archivos o rutas.