File Upload Vulnerabilities

🌐 Vulnerabilidades: File Upload (Carga de Archivos)


🕵️‍♂️ ¿Qué son las vulnerabilidades de carga de archivos?

Las vulnerabilidades de File Upload ocurren cuando una aplicación permite a los usuarios cargar archivos al servidor sin validación o restricciones adecuadas. Esto puede ser explotado para cargar archivos maliciosos, como scripts que comprometen el sistema, archivos que ejecutan ataques XSS o incluso para desbordar el almacenamiento del servidor.


⚙️ ¿Cómo se producen?

  1. Falta de validación del tipo de archivo: La aplicación no verifica que el archivo cargado sea del tipo permitido. Por ejemplo, permite cargar un archivo .php en lugar de solo imágenes como .jpg o .png.

  2. Ejecución de archivos maliciosos: El archivo cargado se almacena en un directorio accesible desde el navegador, lo que permite al atacante ejecutarlo.

  3. Sobrescritura de archivos existentes: Si no se verifica el nombre del archivo cargado, un atacante puede sobrescribir archivos críticos en el servidor.

  4. Metadatos peligrosos: Algunos archivos (como imágenes) pueden contener datos maliciosos incrustados en sus metadatos.

  5. Exploración de directorios: Los atacantes pueden aprovechar la carga de archivos para navegar o acceder a directorios no autorizados.


🛠️ Mecanismo de ataque

  1. Carga de un archivo PHP malicioso:

    <?php
        system($_GET['cmd']);
    ?>

    El atacante carga este archivo al servidor y lo ejecuta desde el navegador:

    http://victim.com/uploads/shell.php?cmd=ls
  2. Carga de una imagen con código malicioso: El atacante sube una imagen con una extensión permitida, pero con código malicioso embebido:

    <img src="javascript:alert('XSS');">
  3. Sobrescritura de archivos importantes: El atacante sube un archivo con el mismo nombre que un archivo crítico del servidor, como:

    index.php

🎯 Impacto

  • Ejecución remota de código (RCE): Los atacantes pueden ejecutar scripts en el servidor.

  • Robo de datos: Acceso no autorizado a archivos o bases de datos.

  • Denegación de servicio (DoS): Sobrecarga del almacenamiento o interrupción del servicio.

  • Propagación de malware: Uso del servidor para distribuir software malicioso.

  • Defacement: Cambiar el contenido del sitio web al cargar archivos que sobrescriban páginas.


📉 Puntaje CVSS v3

  • Vector de ataque: Red (Explotable remotamente)

  • Complejidad del ataque: Media

  • Impacto en confidencialidad: Alto

  • Impacto en integridad: Alto

  • Impacto en disponibilidad: Medio

  • Puntaje CVSS v3: 8.0 - 9.5 (Crítico) 🔥


🧑‍💻 Ejemplo práctico

Código vulnerable:

<?php
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["file"]["name"]);
    
    // Mueve el archivo cargado sin validación
    move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);
    echo "Archivo cargado: " . $target_file;
?>

📌 Ataque: El atacante carga un archivo malicioso llamado shell.php, que es accesible desde:

http://victim.com/uploads/shell.php

🛡️ ¿Cómo prevenir vulnerabilidades de carga de archivos?

1️⃣ Validación estricta del tipo de archivo

Verifica el tipo MIME y la extensión del archivo cargado:

<?php
    $allowed_extensions = ['jpg', 'png', 'gif'];
    $file_extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
    
    if (!in_array($file_extension, $allowed_extensions)) {
        die("Tipo de archivo no permitido.");
    }
?>

2️⃣ Renombrar archivos cargados

Evita que los usuarios controlen el nombre del archivo almacenado en el servidor:

<?php
    $new_file_name = uniqid() . '.' . $file_extension;
    move_uploaded_file($_FILES['file']['tmp_name'], "uploads/" . $new_file_name);
?>

3️⃣ Almacenar archivos fuera del directorio web

Guarda los archivos en un directorio inaccesible desde el navegador y usa un script para acceder a ellos de manera controlada.

4️⃣ Uso de permisos estrictos

Aplica permisos restrictivos a los directorios de carga:

chmod 750 uploads/

5️⃣ Límite de tamaño de archivo

Define un límite máximo para el tamaño de archivo permitido:

ini_set('upload_max_filesize', '2M');

6️⃣ Escaneo de contenido del archivo

Escanea los archivos cargados en busca de contenido malicioso antes de almacenarlos.

7️⃣ Deshabilitar la ejecución de scripts en el directorio de carga

Configura el servidor para que no permita ejecutar scripts en el directorio de carga. En Apache:

<Directory "/var/www/uploads">
    php_admin_flag engine Off
</Directory>

8️⃣ Verificar contenido (no solo extensión)

Confirma que el archivo cargado tiene el contenido esperado:

if (mime_content_type($_FILES['file']['tmp_name']) !== 'image/jpeg') {
    die("Archivo inválido.");
}

💡 Dato extra: Las vulnerabilidades de carga de archivos son frecuentemente utilizadas en combinación con otros ataques, como LFI o RCE, para maximizar el impacto.

🚨 Nota importante: Siempre que implementes funcionalidades de carga de archivos, debes asumir que un atacante intentará abusar de ellas.

Última actualización

¿Te fue útil?