Path Traversal
Last updated
Last updated
Acabo de completar todos los laboratorios de la vulnerabilidad Path Traversal en PortSwigger.
Simple case.
Traversal sequences blocked with absolute path bypass.
Traversal sequences stripped non-recursively.
Traversal sequences stripped with superfluous URL-decode.
Validation of start of path.
Validation of file extension with null byte bypass.
Son los primeros labs que resuelvo de la plataforma y todavÃa estoy dando mis primeros pasitos con BurpSuite, pero me quedo con la experiencia que me resultó súper amena. Vale la pena revisar todo el contenido que ofrecen porque está muy bien explicado.
Nivel: Apprentice.
Nos encontramos con una aplicación de compras, donde la vulnerabilidad reside a la hora de mostrar las imágenes de los productos. El objetivo es leer el archivo /etc/passwd
. Esta dinámica se va a mantener a lo largo de todos los labs para esta vulnerabilidad en concreto.
Hacemos click derecho sobre cualquiera de los Ãtems y seleccionamos la opción para abrir la imagen en una nueva ventana.
Ahora podemos ver en la URL un parámetro filename
, a través del cual podemos controlar qué imagen queremos cargar de las que se encuentran almacenadas en la ruta /var/www/images
. Sin embargo, si es vulnerable, podrÃamos intentar retroceder unos directorios hacia atrás para llegar a la raÃz y cargar otro archivo al que no deberÃamos tener acceso.
Algo a tener en cuenta es que estoy utilizando el propio navegador que trae BurpSuite. Si estuviera con otro navegador, deberÃa usar alguna extensión como FoxyProxy y configurar un proxy; BurpSuite por defecto escucha por el equipo local por el puerto 8080.
Interceptamos la petición con BurpSuite y con Ctrl + R
la emitimos al Repeater:
Desde ahà modificamos lo que vale filename
para intentar acontecer un Directory Path Traversal e incluir un archivo local de la máquina: /image?filename=../../../etc/passwd
¡Y listo! Pudimos listar el /etc/passwd.
Nivel: Practitioner.
Volvemos a encontrarnos con el mismo sitio, asà que seleccionamos una imagen e interceptamos la petición con Burp.
En este caso, las secuencias tÃpicas de un Path Traversal se encuentras bloqueadas, pero podemos intentar cargar directamente el archivo por si parte desde la raÃz indicando su ruta absoluta: /image?filename=/etc/passwd
De esta forma, llegamos a ver el contenido del /etc/passwd
y damos este lab por concluido.
Nivel: Practitioner.
Abrimos una imagen e interceptamos con Burp.
En esta ocasión, se está aplicando una pequeña sanitización respecto al input del usuario, eliminando todos los ../
Sin embargo, esta sanitización no es recursiva. Es decir que se aplica una única vez. Por ende, para bypassear esta restricción, basta con utilizar ....//
en lugar de ../
Lab completado.
Nivel: Practitioner.
Interceptamos la petición con BurpSuite y la emitimos al Repeater.
No vamos a poder aplicar ninguna de las técnicas anteriores. Sabemos que la aplicación bloquea cualquier secuencia de Path Traversal, pero también se nos informa que realiza un URL-decode del input antes de cargar la imagen.
../
no es la única forma que tenemos de escribir esta secuencia. Por ejemplo, primero representamos la barra en formato URL-encode, por lo que ahora la cadena se convierte en ..%2f
.
Posteriormente volvemos a aplicar un URL-encode al porcentaje: ..%252f
Repetimos esa secuencia varias veces y quedarÃa asÃ:
/image?filename=..%252f..%252f..%252f/etc/passwd
Ahora sà funciona y logramos cargar el /etc/passwd
.
Nivel: Practitioner.
Lo mismo que en los labs anteriores; seleccionamos una imagen, interceptamos con Burp y emitimos al Repeater.
La aplicación valida que nuestro input comience por un directorio determinado, en este caso: /var/www/images
. Sin problemas podemos colocar ese path y luego retroceder tres directorios para llegar a la raÃz porque ../
es una secuencia válida y de ahà en más cargar el /etc/passwd
.
¡Lab resuelto!
Nivel: Practitioner.
Interceptamos la petición y la emitimos al Repeater.
En este caso, la aplicación valida que el nombre de archivo que proporcionamos termine con una extensión determinada (.jpg), pero podemos usar un null byte %00
para aislar la extensión y que no se interprete: /image?filename=../../../etc/passwd%00.jpg
De esta forma, completamos el último lab.