../Path-Traversal


Path Traversal es un nombre elegante que significa básicamente acceder a diferentes directorios en la URL. Puedo escucharte decir “¿Cómo es eso?”. Esta es una forma muy básica de ataque, pero veamos de qué va paso a paso.

¿Qué es?

A veces verás lo siguiente en tu URL de un sitio web:

Ejemplo de URL con una referencia de archivo

La parte de uploads/IMG0624.JPG se ve como una ruta del sistema de archivos. La barra / lo delata, probablemente es Linux. Es como buscar archivos en tu computadora.

Al cambiar el nombre de la imagen a IMG0625.JPG, es muy probable que veas otra imagen. Esto significa que si cambias esa ruta por cualquier otra cosa, se mostrará el archivo (si existe). Entonces ?file=config.json quizás podría mostrarnos algo muy interesante. Por supuesto, poder entrever de esta manera lleva mucho tiempo, por lo que existen herramientas como DirBuster que pueden encontrar tus archivos a través de la fuerza bruta.

Atacar

Si el servidor es realmente vulnerable a Path Traversal, con algún conocimiento sobre el sistema de archivos, podrías acceder a cualquier cosa en el servidor.

Tomando en cuenta la barra / podemos asumir que el servidor se está ejecutando en Linux. Y Linux tiene una estructura de sistema de archivos muy específica. Por ejemplo, una de las piezas de información más confidenciales que podríamos obtener sería /root/.ssh/id_rsa, que es la clave privada del servidor (observe la / al principio, el directorio root está situado al comienzo del sistema de archivos). Al recuperar la clave, se puede obtener acceso al servidor usando SSH y adquirir datos valiosos a los que se puede acceder con esa clave privada, como los repositorios git y otros servidores que estén asociados.

Otra forma de llegar al comienzo del sistema es usar ../../../../../../root/.ssh/id_rsa. Esto básicamente sube entre los directorios tanto como le sea posible (puedes tener tantos ../ como desees, ya que Linux no intenta pasar el principio del sistema de archivos, siempre terminará en el directorio /).

Este ejemplo específico probablemente no funcionará en un servidor básico, a menos que el administrador que lo configuró le asignara a la aplicación web permisos root (nunca lo hagas). Por lo tanto, deberás ser muy inteligente para descubrir a qué información puedes acceder. Por supuesto, el ingeniero de software podría haber protegido fácilmente contra Path Traversal en primer lugar.

Defender

No existe una solución única para proteger todo el servidor, pero existen varias medidas de seguridad.

Permisos del servidor

La aplicación web (node.js, PHP, etc.) no debe tener más permisos de los que son absolutamente necesarios. Separar la aplicación del resto del sistema con permisos significa que incluso si el hacker obtiene el acceso a tus archivos, no puede leer la información realmente confidencial, como tu archivo ~/.ssh /id_rsa como se demostró anteriormente. Por supuesto, esto también ayuda con otros tipos de vulnerabilidades.

No utilices referencias directas de archivos

Por lo general, los desarrolladores crean esta funcionalidad para facilitar la gestión de cargas, pero no es muy segura. Hay muchas formas de evitarlo, como hacer referencia al archivo mediante una ID de archivo generada aleatoriamente o mantener tus archivos en otro servidor, como el popular Amazon S3. La regla general es mantener un servidor para un propósito y tenerlo lo más ajustado posible.

Validación de entrada

Esto es básicamente tomar el valor del parámetro y asegurarse de que esté al nivel del estándar. Hay muchas maneras de hacer esto.

**Restringir el acceso a un solo archivo **. Entonces, basename(realpath($_GET['filepath'])) en PHP solo devolvería el nombre del archivo. De esta manera, puedes estar seguro de que nadie obtiene nada de ningún otro directorio. Por supuesto, esta no es una solución muy flexible.

Poner directorios en lista blanca. Es mejor tener un camino concreto donde se permita el acceso del usuario.

$allowedPath = "/var/www/useruploads/avatars";
$userinput = "../../index.php";
$fullpath = realpath($userinput);
if (substr($fullpath, 0, strlen($allowedPath)) === $allowedPath) {
	// $fullpath starts with allowedPath
}

Entonces, lo que sucede allí es que $allowedPath . $ userinput se convierte en /var/www/useruploads../../var/www/index.php, pero realpath convierte eso en un /var/www/index.php confidencial (si encuentra el archivo en el primer lugar). Luego verificas si la nueva ruta realmente coincide con el $allowedPath. En este caso no es así, entonces puedes atrapar al hacker.

Poner los nombres de archivo o tipos de archivo en Lista blanca. Si, por ejemplo, deseas permitir que solo los archivos .png sean permitidos, simplemente verifica si el final de la cadena de entrada coincide con lo que necesitas.

$path = $_GET['filepath'];
if (substr($path, -3) !== ".md") {
	// File is not .md
}

Filtrar cadenas sospechosas. Puedes asegurarte de que la cadena de entrada no comience con / y no contenga ningún ../. Sin embargo, esto no es realmente una solución, porque probablemente no se te ocurran todas las posibilidades que el atacante puede usar y, además, ellos generalmente tienen un arsenal de métodos para hacer bypass (como codificación).

Krister Viirsaar