Directory Path Traversal
Última actualización
Última actualización
Es una vulnerabilidad de seguridad web que permite a un atacante acceder a archivos fuera del directorio raíz designado de un servidor web. Esto podría permitir navegar por el sistema de archivos y acceda a archivos confidenciales o sensibles sin ningún tipo de control.
Esta vulnerabilidad suele ir muy de la mano de un ataque LFI, debido a que las explotaciones se realizan en parámetros de la URL sobre los ficheros propios sistema.
Dentro de los riesgos de seguridad que presentan las aplicaciones web, esta técnica se encuentra en primera posición listada como dentro del informe de 2021, que facilitó el proyecto abierto de seguridad de aplicaciones web y categorizada dentro del sistema de debilidades y vulnerabilidades de software como .
Por ejemplo, si una aplicación web permite a los usuarios ver archivos mediante una URL como la siguiente:
Un atacante podría intentar acceder a archivos fuera del directorio raíz utilizando rutas relativas como:
En este apartado veremos una pequeña demostración de una explotación LFI. En este caso hemos montado un pequeño laboratorio en un docker.
Crearemos un fichero PHP con el siguiente código dónde se espera lo siguiente:
Entrada del usuario no validada: El script PHP toma el valor de $_GET['file']
sin realizar ninguna validación o sanitización. Esto significa que cualquier usuario puede proporcionar cualquier ruta de archivo a través de la URL.
Inclusión de archivo sin verificación: La variable $file
se pasa directamente a la función include()
sin ningún tipo de verificación o validación adecuada. Esto significa que el usuario podría manipular la entrada de la URL para incluir cualquier archivo del sistema de archivos al que tenga permiso de lectura.
Riesgo de Directory Path Traversal: Al no haber validación, un atacante podría usar una ruta relativa en el parámetro file
para retroceder en el sistema de archivos y acceder a archivos sensibles fuera del directorio raíz del servidor web. Por ejemplo, podría intentar algo como file=../../etc/passwd
para acceder al archivo /etc/passwd
.
Primero de todo si intentamos listar un archivo dada su ruta, no obtendremos ningún tipo resultado. Esto sucede porque se ha tomado la ruta /var/www/html como la raíz de la aplicación web.
Pero como hemos comentado anteriormente, al no haber una validación o sanitización es posible retroceder dentro de la estructura de directorios del sistema y listar archivos de configuración críticos como /etc/shadow o /etc/passwd.
Para evitar ser vulnerables a Directory Path Traversal es posible implementar una serie de medidas de seguridad (tomando de partida el código PHP utilizado para la PoC).
Validación de la entrada del usuario: Antes de incluir el archivo, debes validar y sanitizar la entrada del usuario para asegurarte de que solo se permitan caracteres válidos y que la ruta del archivo esté dentro del directorio permitido.
Utilizar rutas absolutas: En lugar de incluir la ruta del archivo proporcionada por el usuario directamente, podrías construir una ruta absoluta basada en un directorio raíz predefinido. Esto evitará que los usuarios utilicen rutas relativas para retroceder en el sistema de archivos.
Limitar el acceso a directorios específicos: En lugar de permitir el acceso a cualquier archivo en el sistema de archivos, podrías restringir el acceso solo a ciertos directorios específicos que contengan archivos permitidos.
Código PHP aplicando las correspondientes mejoras de seguridad.
Con estas mejoras, el código será más seguro y mitigará la vulnerabilidad de Directory Path Traversal al limitar el acceso solo a archivos dentro del directorio raíz permitido y filtrar cualquier intento de acceso a directorios fuera de este ámbito.