Imagine una aplicación de compras que muestra imágenes de artículos en venta. Esta podría cargar una imagen con el siguiente HTML:
<imgsrc="/loadImage?filename=218.png">
La loadImage URL toma un filenameparámetro y devuelve el contenido del archivo especificado. Los archivos de imagen se almacenan en el disco en la ubicación /var/www/images/. Para devolver una imagen, la aplicación añade el nombre del archivo solicitado a este directorio base y utiliza una API del sistema de archivos para leer el contenido del archivo. En otras palabras, la aplicación lee desde la siguiente ruta de archivo:
/var/www/images/218.png
Esta aplicación no implementa defensas contra ataques de cruce de ruta. Por lo tanto, un atacante puede solicitar la siguiente URL para recuperar el /etc/passwdarchivo del sistema de archivos del servidor:
Esto hace que la aplicación lea desde la siguiente ruta de archivo:
/var/www/images/../../../etc/passwd
La secuencia ../ es válida dentro de una ruta de archivo y significa ascender un nivel en la estructura de directorios. Las tres ../secuencias consecutivas ascienden desde /var/www/images/ la raíz del sistema de archivos, por lo que el archivo que se lee es:
/etc/passwd
En los sistemas operativos basados en Unix, este es un archivo estándar que contiene detalles de los usuarios registrados en el servidor, pero un atacante podría recuperar otros archivos arbitrarios utilizando la misma técnica.
En Windows, tanto ../ y ..\ son secuencias válidas de recorrido de directorio. El siguiente es un ejemplo de un ataque equivalente contra un servidor Windows: