Web Shell Upload via Content-Type Restriction Bypass
Introducción
Las vulnerabilidades que permiten la subida de archivos maliciosos, como las web shells, son particularmente críticas ya que proporcionan a los atacantes acceso remoto a un servidor web. En este post, exploraremos la vulnerabilidad de Web Shell Upload via Content-Type Restriction Bypass, que es un bypass de restricción basado en el tipo de contenido HTTP, permitiendo la subida de archivos maliciosos en servidores vulnerables.
¿Qué es una Web Shell?
Una web shell es un archivo que permite la ejecución remota de comandos en el servidor donde está alojada. Los atacantes suben estos archivos para obtener una consola remota con la que pueden ejecutar comandos arbitrarios, escalar privilegios o pivotar dentro de la red. Una web shell común suele estar escrita en PHP, ASP, JSP u otros lenguajes soportados por el servidor.
Ejemplo de Web Shell en PHP
1
<?php system($_GET['cmd']); ?>
Este sencillo script PHP permite a un atacante ejecutar comandos en el servidor enviando parámetros a través de la URL (cmd
).
Lab: Web shell upload via Content-Type restriction bypass
Este laboratorio contiene una función de subida de imágenes vulnerable. Intenta evitar que los usuarios suban tipos de archivos inesperados, pero se basa en la comprobación de la entrada controlable por el usuario para verificarlo.
Para resolver el laboratorio, sube una shell web PHP básica y utilízala para exfiltrar el contenido del archivo /home/carlos/secret. Envía este secreto utilizando el botón que aparece en el banner del laboratorio.
Primer Paso
En tu sistema, crea un archivo llamado exploit.php, que contenga un script para obtener el contenido del secreto de Carlos. Por ejemplo
1
<?php echo file_get_contents('/home/carlos/secret'); ?>
Podrás ver que al tratar de subir el archivo, debido a un filtro de la pagina web, no podrá ser subido.
Si echamos un vistazo a lo que nos dice, solo acepta tipos image/jpeg e image/png
Segundo Paso
Aquí, subimos un archivo llamado web-shell.php
, pero indicamos que su Content-Type es image/png
. Esto engaña al servidor para que acepte el archivo, ya que solo revisa el encabezado en lugar de validar el contenido real del archivo.
Y vemos que nuestra web shell se ha subido correctamente.
Tercer Paso
Una vez subido, accedemos al archivo PHP directamente en el servidor para verificar que se ha subido correctamente. Si el archivo se ha subido sin ningún tipo de validación adicional, tendremos acceso a la web shell.
Ejemplo de URL para ejecutar comandos en la web shell:
https://0a9d00f704787b4e8123756300e8003e.web-security-academy.net/files/avatars/web-shell.php
Cuarto Paso
Una vez obtenida la web shell, el atacante puede:
- Ejecutar comandos del sistema operativo (reconocimiento de la infraestructura).
- Moverse lateralmente dentro de la red de la organización.
- Subir archivos adicionales, como un backdoor más robusto.
En este caso el objetivo es leer el archivo secret dentro de la carpeta /home
del usuario carlos
El Content-Type Restriction Bypass es un ejemplo clásico de cómo la falta de validaciones adecuadas puede resultar en una vulnerabilidad crítica. Los desarrolladores deben implementar controles más robustos para la subida de archivos y nunca confiar en los encabezados HTTP proporcionados por el cliente. La prevención de la ejecución de código en directorios de subida y la inspección del contenido de los archivos son pasos cruciales para evitar este tipo de ataques