File Upload
web hacking
El abuso de subidas de archivos es un tipo de ataque que se produce cuando un atacante aprovecha las vulnerabilidades en las aplicaciones web que permiten a los usuarios cargar archivos en el servidor. Este tipo de ataque se conoce comúnmente como un ataque de "subida de archivos maliciosos" (File upload attacks).
el objetivo principal de este ataque es conseguir una webshell en el servidor, ya que En un ataque de subida de archivos maliciosos, un atacante carga un archivo malicioso en una aplicación web, que luego se almacena en el servidor. Si por ejemplo el atacante consigue subir un archivo PHP y el servidor web lo almacena, podría conseguir ejecución remota de comandos y tomar el control del servidor.
File Upload Attacks Methods
los métodos que veremos, pueden combinarse entre ellos para ser lo mas sofisticados posibles y tratar de evitar detecciones.
para ejecutar las web shells debemos encontrar la ruta del script malicioso que se ha subido, indicar el parámetro del código y posteriormente un comando. comúnmente se indica la ruta al subir el archivo, pero si no se hace puedes buscar desde el directorio correspondiente al hacer click derecho y ver ruta de la imagen, si es que son imágenes y encontraras las rutas donde se almacenan, probablemente con el nombre del archivo. si no encuentras donde se almacena la web shell debes considerar otras técnicas para encontrarla como la búsqueda de rutas hasheadas.
Ataque de File Upload simple
el ataque simple supone que el servidor victima no cuenta con ningún tipo de sanitización o seguridad al subir archivos, podemos probarlo subiendo nuestra web shell de forma normal, si el servidor permite subirlo probablemente no vamos a necesitar para esto alguna técnica de evasión que veremos.
Ataque de File Upload evasión whitelist de extensiones
esta medida de seguridad usualmente deficiente se basa en una lista blanca de extensiones de archivos, y la web trata de comprobar si la extensión del archivo subido es confiable.
Evadiendo Whitelist de extensiones (validación en el lado del cliente)
si el sitio web solo permite ciertas extensiones de archivos, podemos comprobar si esta validación se hace del lado del cliente (navegador) o servidor, si es del caso del cliente podemos burlar esta medida fácilmente abriendo el frontend por inspeccionar y eliminando validaciones
Evadiendo Whitelist de extensiones (validación en el lado del servidor)
hay algunas formas de evadir la detección si esta se hace del lado del servidor, veremos algunas:
Bloqueo limitado de extensiones: podemos probar subiendo los archivos con otra extensión pero que de igual manera interprete el código el cual hemos subido, por ejemplo si intentamos subir un php podemos subirlo como php3 u otras extensiones que de igual manera interpreten el código de la misma manera. Haz click aquí para encontrar variedad de extensiones (que el servidor nos haya dejado subir el archivo no significa que nos interprete el código al visitar la url del upload, por lo que si no nos interpreta el código debes intentar con todas las extensiones posibles). Capturar estas solicitudes de enviar el archivo y enviarlas al repeater de burpsuite te permite probar cosas mas rápidamente
.HTACCESS: si el anterior no funciono, este podría hacerlo (técnica solo para servidores apache), El archivo
.htaccesses un archivo que se usa en servidores web apache para configurar ciertos aspectos del comportamiento de un sitio web. Se coloca en el directorio de un sitio web y le dice al servidor cómo manejar cosas como Redirigir páginas, Proteger áreas del sitio, Mejorar URLs, Controlar Errores, Etc. en el repeater de burpsuite (al capturar la solicitud donde se envía el archivo) ponemos como filename .htaccess (osea, como el archivo que estamos subiendo), content type en texto plano y la configuración que hemos hecho se refiere a que: los archivos que sean .test (como dice en el ejemplo) deben interpretarse como código php:
ahora si podemos subir nuestra webshell siempre y cuando pongamos la extensión que hayamos especificado, en este caso "test":
el content-type debe ser php, finalmente pondremos nuestra webshell.
File Upload Abuse por ataque de doble extensión
Un "ataque de doble extensión" en ciberseguridad se refiere a un tipo de ataque que involucra archivos con extensiones engañosas, diseñados para eludir medidas de seguridad o confundir a los usuarios. En este caso, los atacantes aprovechan las extensiones de los archivos para que parezcan inofensivos o legítimos, pero en realidad, contienen código malicioso.
podemos enviar los archivos maliciosos al servidor combinados con esta técnica para evitar detecciones, por ejemplo:
el servidor solo acepta gifs:
exploit.php -> exploit.gif.phpAtaque de File Upload evadiendo restricción de tamaños
si el sitio web esta sanitizado para evitar la subida de archivos muy pesados, tenemos algunas formas de burlar esta medida, de preferencia capturando y enviando solicitudes al repeater de burpsuite que nos hacen el trabajo mas eficiente.
Ataque de File Upload evadiendo restricción de tamaños modificando validaciones
si desde la request que estamos enviando se define el peso máximo del archivo, podremos lógicamente cambiarlo desde ahí y posteriormente enviar la solicitud si no se aplican validaciones adicionales.
Ataque de File Upload evadiendo restricción de tamaños acortando la web shell
si el método anterior no funciona en un servidor, podemos intentar reducir nuestra webshell hasta ser lo mas diminuta posible, si es en PHP lo mas que podemos reducir una webshell es así:
<?`$_GET[0]`Ataque de File Upload modificando el MIME
Los magic numbers son unos números alfanuméricos que de manera codificada identifican el tipo o formato de un archivo, suelen estar ubicados al principio del archivo (MIME type). Estas secuencias de Bytes se utilizan para que los programas informáticos puedan reconocer el tipo de archivo sin depender únicamente de su extensión de archivo o su contenido interno. Son muy importantes en sistemas operativos y aplicaciones que necesitan determinar cómo procesar un archivo.
cada archivo comienza con una secuencia especifica de bytes que indica su tipo de archivo, por ejemplo un binario, scripts de shell, etc esto permite ejecutar los programas por un formato adecuado sin depender de la extensión del archivo.
para hacerlo a la hora de explotar la subida de archivos podemos cambiar los magic numbers desde el codigo, por ejemplo:
GIF8;
<?php
system($_GET['cmd']);
?>en este caso estamos indicando que es un GIF (si quieres buscar mas, puedes encontrarlas dando click aquí o también aquí). Pero no basta con solo hacer esto, ya que también debemos cambiar el content-type a la hora de enviar la solicitud junto al archivo, podemos interceptar la solicitud desde burpsuite para indicarlo:
# compilacion de content types de imagenes
Content-Type: image/jpg
Content-Type: image/jpeg
Content-Type: image/png
Content-Type: image/gifpodemos buscar mas content-types aqui: https://developer.mozilla.org/en-US/docs/Web/HTTP/MIME_types/Common_types
Last updated