Parte: 4 — Seguridad de aplicaciones web · Fuente: The Web Application Hacker's Handbook / Bug Bounty Bootcamp (Vickie Li) ⏱️ Duración estimada: 100 min · Nivel: Avanzado
Explotar fallos en la carga de archivos (file upload): subir contenido malicioso que la aplicación acepta y ejecuta o sirve de forma peligrosa. Un upload mal validado puede convertirse en web shell (RCE), XSS almacenado, path traversal o SSRF.
⚠️ Ética: subir una web shell equivale a RCE. Solo en labs propios/autorizados (DVWA, PortSwigger). Nunca en sistemas ajenos.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Validaciones de upload | Qué hay que evadir |
| 2 | Bypass por extensión | Filtros de blocklist |
| 3 | Bypass por Content-Type y magic bytes | Validación superficial |
| 4 | Web shell y RCE | Impacto máximo |
| 5 | Upload → XSS/SVG | Vectores alternativos |
| 6 | Path traversal en el nombre | Sobrescritura de archivos |
| 7 | Defensa: allowlist, renombrar, aislar | Cierre del fallo |
.php) que ejecuta comandos al accederse. Característica: da control del servidor..phtml, .php5).$_GET['cmd']).⚠️ Solo en labs propios y aislados.
.phtml, .php5, .pHp.image/png en Burp manteniendo el contenido PHP.GIF89a; al código PHP.?cmd=id) en el lab.../ para path traversal.../ en el nombre para intentar sobrescribir un archivo.Consigue RCE subiendo una web shell en un lab (DVWA Medium o PortSwigger) evadiendo al menos una validación, y ejecuta un comando. Criterio de aceptación: entregas el archivo subido, la validación evadida, la evidencia de ejecución de comando y la corrección (allowlist, renombrado, almacenamiento fuera del webroot).
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| Extensión rechazada | Blocklist; prueba variantes o doble extensión |
| Se sube pero no ejecuta | Fuera del webroot o sin handler PHP; busca ubicación ejecutable |
| Content-Type validado | Falsifícalo en Burp manteniendo el contenido |
| Magic bytes comprobados | Antepón la firma del tipo permitido |
| Nombre saneado | Path traversal bloqueado; prueba encoding |
❓ ¿Basta validar la extensión? No. Hay que validar tipo real, renombrar, y sobre todo almacenar donde no se ejecute el contenido.
❓ ¿Por qué un SVG es peligroso? Porque es XML y puede contener JavaScript; servido inline, ejecuta XSS en el contexto de la app.
❓ ¿Dónde guardo los uploads?
Fuera del directorio web servible, con nombres generados, y sírvelos con Content-Type y Content-Disposition seguros.
Clase 107 — Server-Side Template Injection (SSTI)