byp4ss3d write up

Descripción
A university’s online registration portal asks students to upload their ID cards for verification. The developer put some filters in place to ensure only image files are uploaded but are they enough? Take a look at how the upload is implemented. Maybe there’s a way to slip past the checks and interact with the server in ways you shouldn’t.
byp4ss3d solución
Lanzamos la instancia y se nos proporcionará un enlace a una página web.

Al subir un archivo, la página nos devolverá un enlace para poder acceder a él. En este caso, para poder ver más información de la instancia, subiremos un archivo que nos permita ejecutar comandos y explorar el servidor.
Al ver el código con Ctrl + U podemos ver que el formulario de subida llama a la página ‘upload.php’. Con esto vemos que el servidor puede interpretar código php. Intentaremos enviar un archivo en este lenguaje que nos permita ejecutar comandos.
Lanzaremos BurpSuite e interceptaremos con el proxy la subida del siguiente archivo llamado ‘test.php’:
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd']);
}
?>
Enviaremos la petición al Repeater con Ctrl + R para poder modificarla y probar como responde el servidor:

En el Repeater, al modificar su nombre a ‘test.php.jpg’ la subida se completa correctamente:

Pero al acceder a ella en el enlace, nos encontraremos con el siguiente error:

En este caso, hemos pasado el filtro inicial, pero el servidor no está reconociendo la extensión .php.jpg como .php. Necesitamos más información del servidor para ver si seguir por este camino. Para ello, forzaremos un error entrando en la url ‘/test’, una que devolverá un error 404:

Vemos que el servidor es un Apache. En este caso, los servidores Apache tienen un archivo en cada carpeta ‘.htaccess’ con la configuración del directorio. Si el filtro no está configurado para bloquear la subida de archivos .htaccess, podríamos sobreescribir el que exista en el lado del servidor y ejecutar el archivo con la extensión .php.jpg como un archivo .php.
Enviaremos el nuevo .htaccess indicando que se ejecuten todos los archivos .jpg como .php:

AddType application/x-httpd-php .jpg
Ahora, al refrescar, veremos que ha desaparecido el error. Añadiremos en la url el siguiente contenido:
?cmd=ls
Obteniendo así el contenido de la carpeta /images:

Añadiremos al ls ../ hasta que veamos un archivo que pueda tener la flag. Esto sucederá con ‘?cmd=ls ../../’, obteniendo el archivo flag.txt. Cambiaremos ls por cat para ver el contenido y añadiremos al final flag.txt:
?cmd=cat ../../flag.txt
Obteniendo así la flag y completando el CTF:

Consultor de ciberseguridad especializado en continuidad de negocio y respuesta ante incidentes. Interesado en analizar tecnologías desde una perspectiva de seguridad y descubrir su comportamiento real.
