Riesgos de File Upload

La funcionalidad de carga de archivos (file upload) es una de las más comunes y útiles en aplicaciones web modernas. Permite a los usuarios compartir documentos, imágenes, videos y otros contenidos. Sin embargo, esta aparente sencillez esconde una de las superficies de ataque más peligrosas si no se implementa con las debidas medidas de seguridad.

La falta de validaciones, controles de acceso o simples errores en el manejo de archivos pueden llevar a consecuencias críticas como ejecución remota de código, ataques de denegación de servicio (DoS), almacenamiento de malware, entre otros.

En este artículo exploraremos a fondo los vectores más importantes relacionados con la carga de archivos, los riesgos asociados, cómo detectarlos durante un análisis de seguridad y, por supuesto, cómo mitigarlos de forma efectiva.


Principales vectores de ataque en File Upload


Límite de tamaño de archivo

Permitir archivos excesivamente grandes puede llevar a un agotamiento de recursos del servidor (RAM, CPU, espacio en disco).

  • Prueba: Subir archivos de gran tamaño (1–5 GB) y observar el comportamiento del sistema.

  • Mitigación: Establecer un límite estricto en MB/KB a nivel de frontend y backend. Utilizar Content-Length y maxRequestSize.


Restricciones de tipo de archivo

Restringir la extensión del archivo no es suficiente. Muchos ataques se camuflan usando extensiones dobles o tipos poco comunes.

  • Prueba: Subir archivos como archivo.php.jpg o cambiar extensión de scripts maliciosos.

  • Mitigación: Validar extensiones y tipo MIME real. Utilizar listas blancas (whitelisting), nunca listas negras (blacklisting).


Validación del tipo MIME

El header Content-Type puede ser manipulado fácilmente. El tipo MIME debe validarse contra el contenido del archivo.

  • Prueba: Cambiar el Content-Type a image/png mientras se sube un .exe o .php.

  • Mitigación: Verificar el MIME con herramientas del sistema operativo o bibliotecas seguras (ej. finfo en PHP).


Validación del nombre del archivo

Nombres como ../../../etc/passwd, .htaccess o evil.php pueden ser utilizados para ataques de path traversal o ejecución de código.

  • Prueba: Subir archivos con secuencias como ../, %2e%2e/ o nombres especiales.

  • Mitigación: Renombrar los archivos automáticamente, eliminar caracteres especiales y validar patrones permitidos.


Escaneo de malware

Cargar archivos sin análisis antivirus es abrir una puerta directa al almacenamiento de malware en el servidor.

  • Prueba: Subir archivos EICAR (archivo de prueba de antivirus).

  • Mitigación: Integrar antivirus actualizado (ClamAV, VirusTotal API, etc.) en el backend antes de guardar el archivo.


Archivos duplicados

El mal manejo de archivos con el mismo nombre puede sobreescribir archivos legítimos o generar rutas colisionadas.

  • Prueba: Subir múltiples archivos con el mismo nombre y analizar resultados.

  • Mitigación: Usar identificadores únicos (UUIDs), timestamps o hash del contenido como nombre final.


Directorio de carga inseguro

Si los archivos subidos se alojan en directorios accesibles públicamente sin restricciones, pueden ser explotados directamente.

  • Prueba: Acceder a https://sitio.com/uploads/archivo.php después de la carga.

  • Mitigación: Usar directorios fuera del webroot, servir archivos mediante controladores autenticados.


Permisos de archivos

Archivos subidos no deben tener permisos de ejecución a menos que sea estrictamente necesario (lo cual es raro).

  • Prueba: Verificar con ls -l o usar una shell si se tiene acceso.

  • Mitigación: Asegurar permisos 0644 para archivos y 0755 para carpetas como estándar.


Autenticación para subir

No todos los usuarios deben poder subir archivos. El endpoint de carga debe requerir autenticación y, de ser posible, autorización específica.

  • Prueba: Intentar subir sin estar autenticado o desde un rol no autorizado.

  • Mitigación: Aplicar validación de sesión y control de permisos basado en roles.


Validación de imágenes

Las imágenes pueden contener código malicioso oculto en los metadatos (EXIF) o manipular bibliotecas vulnerables de procesamiento.

  • Prueba: Usar imágenes de fuzzing como test cases o payloads comunes en JPEG.

  • Mitigación: Procesar las imágenes con herramientas que reescriban el contenido (ImageMagick, GD, etc.), eliminando datos peligrosos.


Validación del contenido

Un archivo puede tener nombre .jpg pero ser un script PHP en su interior.

  • Prueba: Subir un archivo con contenido HTML o script y extensión falsa.

  • Mitigación: Validar el contenido binario real del archivo, no sólo su extensión o tipo MIME.


Límites simultáneos de carga

Permitir múltiples archivos al mismo tiempo puede hacer que un atacante sature el servidor con decenas de uploads simultáneos.

  • Prueba: Automatizar múltiples cargas paralelas.

  • Mitigación: Establecer límites de concurrencia y monitorear uso de recursos.


Timeouts y tiempo de carga

Un archivo que tarde demasiado en cargar puede bloquear recursos o dejar conexiones abiertas.

  • Prueba: Cargar un archivo lento (usando sleep en scripts) y monitorear el servidor.

  • Mitigación: Definir tiempo máximo de carga en servidor y cliente.


Rate Limiting

Sin límites de tasa, un atacante puede lanzar un ataque de denegación de servicio por sobrecarga de solicitudes de carga.

  • Prueba: Automatizar cargas con herramientas como Burp Intruder.

  • Mitigación: Implementar rate limiting por IP, sesión o token.


Manejo de errores

Mensajes de error detallados pueden revelar rutas internas, configuraciones o incluso información sensible.

  • Prueba: Subir archivos mal formateados o que generen excepciones.

  • Mitigación: Manejar errores con mensajes genéricos y registrar los detalles sólo en logs del servidor.


XSS en metadatos

Algunos formatos como PDF, SVG o imágenes JPEG permiten inyectar scripts en metadatos o en el nombre del archivo.

  • Prueba: Inyectar código HTML o JavaScript en campos como título o descripción.

  • Mitigación: Sanear y escapar todos los datos al mostrarlos en el frontend.


Path Traversal

Se puede intentar sobrescribir archivos o acceder a rutas restringidas con nombres como ../../archivo.

  • Prueba: Subir archivos con nombres que busquen subir fuera del directorio de uploads.

  • Mitigación: Filtrar rutas, deshabilitar subida de archivos con ../, y trabajar con rutas absolutas predefinidas.


SQL Injection en metadatos

Algunos sistemas insertan información de los archivos en bases de datos. Esto puede abrir puertas a SQLi.

  • Prueba: Subir archivos con nombres como '; DROP TABLE users;--

  • Mitigación: Usar sentencias preparadas (prepared statements) y sanitizar todos los campos.


Control de acceso

No todos los usuarios deberían poder ver o borrar cualquier archivo subido.

  • Prueba: Intentar acceder al archivo subido por otro usuario o desde otra sesión.

  • Mitigación: Asociar archivos con propietarios y validar acceso en cada solicitud.


Registro y monitoreo

Un sistema robusto debe registrar cada carga de archivo, especialmente si hay actividad sospechosa o rechazos.

  • Prueba: Revisar si las cargas aparecen en los logs del servidor o SIEM.

  • Mitigación: Loguear timestamp, usuario, IP, tipo de archivo y nombre original. Integrar alertas para eventos anómalos.


La carga de archivos es uno de los vectores más subestimados pero más explotados en ataques reales. Los errores de implementación pueden permitir desde ataques triviales hasta compromisos completos del servidor o la red.

Tanto si eres pentester como desarrollador, tener una checklist de seguridad para file upload es esencial. Debes verificar tamaño, tipo, MIME, nombres, rutas, permisos, autenticación, contenido, errores, y más. Además, nunca se debe confiar en validaciones del lado cliente: toda la seguridad crítica debe implementarse en el backend.

Cada archivo subido por un usuario externo es un potencial Troyano.

#FileUpload ? #WebSecurity ? #CyberSecurity ?️ #Pentesting ? #MalwareDetection ? #AccessControl ? #SecureCoding ? #OWASP ? #InputValidation ? #DoSProtection ⚠️

Previous Post

Next Post

Loading Next Post...
Follow
Search Trending
Popular Now
Loading

Signing-in 3 seconds...

Signing-up 3 seconds...

Cart
Cart updating

ShopYour cart is currently is empty. You could visit our shop and start shopping.