Hacking Lab

En que consiste la vulnerabilidad File Upload?

La vulnerabilidad de File Upload (carga de archivos) en aplicaciones web se refiere a la posibilidad de que un atacante suba archivos maliciosos a un servidor. Esta vulnerabilidad puede ser explotada si no se implementan adecuadas medidas de seguridad en el proceso de carga de archivos. Existen varios tipos de validaciones que emplean los desarrolladores, las cuales no se implementan del todo correctas, y dan lugar a fuentes de entrada a los atacantes:

Restriccion de archivo por su extension:

Existen varias formas de intentar burlar una validacion de archivo para subir un ejecutable, primeramente probar cambiando la extencion del archivo (ej: php=php3-8,pht,phtml,phar,etc), muchas veces la validacion de los archivos se limita solo a una Black List, con una serie de extenciones prohibidas, pero esta podría no ocupar la totalidad de las variantes.

Tambien podria suceder que el desarrollador contemple una Black List que abarque todas las variantes de una extension, pero se olvide de otros recursos como archivos de configuracion del servidor que podrian modificar las politicas en est, como lo sreian en archivo .htaccess para servidores Apache2 y el web.config para servidores de miscrosoft IIS.

Por tanto, otra forma de intentar burlar estas validaciones y ejecutar codigo malicioso en el servidor, seria intentar definir una nueva politica subiendo un archivo .htaccess en el caso de servidores Apache. El archivo .htaccess es un archivo de configuración utilizado por servidores web que ejecutan el software Apache HTTP Server. Este archivo permite a los administradores del sitios web y a los desarrolladores controlar diversas configuraciones del servidor web sin necesidad de acceder a los archivos de configuración principales de Apache. Para que el servidor apache ejecute un script php solicitado por el cliente, el desarrollador debe agregar la siguiente configuracion en "/etc/apache2/apache2.conf":

LoadModule php_module /usr/lib/apache2/modules/libphp.so
AddType application/x-httpd-php .php

Si esta configuracion esta activa, los scripts php seran interpretados por el servidor, por tanto si se lograse colar el un archivo .htaccess se podria definir la siguiente politica, donde un archivo con extencion valida para subir (en este caso .test) seria interpretado como php:

AddType application/x-httpd-php .test

Otro archivo de configuraciones que permite este tipo de acciones es el web.config, presente en aplicaciones web de tecnologia Microsoft basadas en asp.net

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <!-- Configuración de mapeo de módulos -->
    <modules>
      <remove name="php" />
      <add name="php" type="System.Web.HttpApplication, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>
</configuration>

Restriccion de archivo por su tamaño:

Otro tipo comun de validacion de archivo es por su tamaño, tal vez los desarrolladores hayan puesto una restriccion de tamaño maximo para cargas de archivos en el servidor, por lo tanto en estas situaciones convendria ajustar el payload lo maximo posible:

<?`$_GET[0]`

Restriccion de archivo por medio del Content-Type:

El "Content-Type" es un encabezado de la cabecera HTTP que indica el tipo de contenido que se está enviando en el cuerpo de una solicitud o respuesta HTTP. Este encabezado es crucial para que el receptor de la solicitud o respuesta (ya sea un navegador web, una API, un servidor, etc.) entienda cómo procesar y manejar el contenido recibido.

Ejemplos comunes de "Content-Type":

Content-Type: text/plain
Content-Type: text/html
Content-Type: application/json
Content-Type: application/xml
Content-Type: image/jpeg
Content-Type: image/png
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data
Content-Type: application/xphp

Este metodo por si solo no es demasiado efectivo, ya que utilizando un proxy como BurpSuite se puede manipular esta cabecera y engañar al servidor.

Restriccion de archivo por medio de Magic Numbers:

Muchos tipos de archivos comienzan con una secuencia específica de bytes que actúan como una firma o identificación del tipo de archivo. Esta secuencia que permite a los programas y sistemas operativos reconocer y manejar los archivos correctamente se conoce como Magic Numbers.
Los desarrolladores tambien podrian utilizar esto para validar un tipo de archivo, pero si no se implementa junto a otras practicas, tambien se podria engañar esta restriccion. Por ejemplo, en un portal donde solo se permita la carga de imagenes, un atacante podria inyectar codigo php en los metadatos de una imagen para luego intentar cargarlo desde el servidor.
En el siguiente comando se usa la herramienta exiftool para agregar un script php a los comentarios de una imagen, y luego intentar subirla como image.php, si la unica validacion que se esta aplicando es por medio de los Magic Numbers, el archivo sera cargador como imagen, pero si se solicita desde el navegador, ser interpretado el codigo php incrustado en esta. Esto se conoce como archivo poliglota.

exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o image.php

Condiciones de Carrera (Race Conditions)

Por ejemplo, sitios web pueden cargar los archivos en la ruta principal del sistema de archivos o en otro lugar para luego analizarlos y detectar posibles archivos maliciosos y de ser este el caso eliminarlos inmediatamente, pero esto es peligroso ya que permite a un atcante, si conoce la ruta, intentar aprobecharse de condiciones de carrera.

Estas vulnerabilidades son dificiles de detectar en un entorno de BlackBox, a menos que se tenga una via de poder fitrar codigo fuente, ya que se desconoce la ruta donde los archivos son testeados.

El principal objetivo es lograr cargar el archivo antes de que este sea testeado y eliminado del sistema o modificado de caulquier forma que afecte su acceso.

Subida de archivos usando el metodo PUT

Vale la pena señalar que algunos servidores web pueden estar configurados para admitir solicitudes PUT. Si no se implementan las defensas adecuadas, esto puede proporcionar un medio alternativo para cargar archivos maliciosos, incluso cuando una función de carga no está disponible a través de la interfaz web.

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

Para verificar si el metodo PUT es permitido, se puede enviar una solicitud con el metodo OPTIONS a diferentes rutas.