En este post vamos a estar resolviendo el laboratorio de PortSwigger: “Web shell upload via obfuscated file extension”.

Página de inicio del laboratorio de PortSwigger

Para resolver el laboratorio tenemos que subir un archivo PHP que lea y nos muestre el contenido del archivo /home/carlos/secret. Ya que para demostrar que hemos completado el laboratorio, deberemos introducir el contenido de este archivo.

Además, el servidor está configurado para que no acepte ciertas extensiones.

En este caso, el propio laboratorio nos proporciona una cuenta para iniciar sesión, por lo que vamos a hacerlo:

Formulario de inicio de sesión

Credenciales de acceso proporcionadas

Una vez hemos iniciado sesión, nos encontramos con el perfil de la cuenta:

Perfil de usuario

Una vez estamos en el perfil, como vemos, tenemos un campo de subida de archivos para actualizar el avatar de nuestra cuenta. Vamos a intentar aprovecharnos de esto para subir el siguiente archivo:

Código PHP para leer el archivo secret

Antes que nada, vamos a preparar el burp suite para que intercepte las peticiones:

Configuración del proxy en el navegador

Activación de la interceptación en Burp Suite

Una vez tenemos esta parte configurada, subimos el archivo:

Selección de archivo para subir

Confirmación de subida de archivo

Procesando la subida del archivo

Burp suite interceptará la petición de subida:

Petición interceptada en Burp Suite

Para tratar mejor con el proceso de subida de archivos, vamos a pasar la petición al repeater pulsando Ctrl R:

Petición enviada al Repeater de Burp Suite

Como vemos, en este caso, al darle al Send, vemos en la respuesta del servidor que solo los archivos JPG y PNG están permitidos.

Por lo que la idea va a ser introducir una doble extensión junto a un null byte para ver si podemos bypasear esta restricción:

Modificación de la extensión con null byte

Respuesta exitosa del servidor

Al enviar la petición, vemos como en la respuesta, el archivo se ha subido, no solo eso, sino que gracias al null byte, nos hemos desecho de la segunda extensión que habiamos puesto .jpg. Por lo que con esto hecho, vamos a ver la respuesta en el navegador:

Opción para ver respuesta en navegador

Selección de mostrar respuesta en navegador

Respuesta renderizada en el navegador

Confirmación de subida exitosa

Ya no vamos a usar burp suite, por lo que desactivamos el proxy:

Desactivación del proxy

Una vez desactivado, nos volvemos a nuestro perfil:

Acceso al perfil de usuario

Vista del perfil con avatar actualizado

Como vemos, el avatar se ha establecido, sin embargo, parece que ha ocurrido un fallo al cargar la imagen. Probablemente porque intenta cargar nuestro archivo PHP como si fuese una imagen y por eso falla. Vamos a acceder a la ruta directa de “la imagen” dandole click derecho:

Menú contextual para abrir imagen

Error al acceder con extensión incorrecta

Parece que nos da un problema, sin embargo, si nos fijamos en la URL, se nos intenta cargar el archivo readSecret.php%00.jpg, cuando realmente, el archivo resultante fue readSecret.php. Por lo que cambiamos la URL para acceder a este último archivo:

Ejecución exitosa del código PHP

Y de esta forma, accedemos al código PHP y se interpreta, consiguiendo así que leamos el archivo secret.

Habiéndolo leído, ya simplemente enviamos la solución:

Formulario para enviar la solución

Confirmación de solución enviada

Y de esta forma, completamos el laboratorio:

Laboratorio completado exitosamente

Mensaje de confirmación final