Carga de archivos: Una funcionalidad de alto riesgo
La funcionalidad de carga de archivos es una de las más sensibles en seguridad. Cada archivo subido es potencialmente malicioso — podría ser un script disfrazado como imagen, una zip bomb o un archivo con nombre diseñado para explotar el sistema de archivos.
Validación de tipos de archivo
Validación del lado del cliente
El atributo accept en inputs de archivo restringe qué archivos puede seleccionar el usuario:
<input type="file" accept=".jpg,.jpeg,.png,.gif" />
Probando validación del cliente:
- Seleccionar un tipo válido — debería aceptarse
- Intentar seleccionar un tipo inválido — debería rechazarse
- Evadir el atributo accept (renombrar .exe a .jpg) — el servidor debe capturarlo
Validación del lado del servidor
El servidor debe validar el contenido real, no solo la extensión:
| Caso de prueba | Archivo | Esperado |
|---|---|---|
| Imagen válida | foto.jpg (JPEG real) | Aceptar |
| Extensión incorrecta | foto.txt (JPEG renombrado) | Rechazar o aceptar por contenido |
| Extensión falsa | malware.jpg (realmente .exe) | Rechazar |
| Doble extensión | image.jpg.php | Rechazar |
| SVG con JavaScript | vector.svg (contiene <script>) | Sanitizar o rechazar |
Testing de tamaño de archivo
| Caso de prueba | Esperado |
|---|---|
| Bajo el límite | Aceptar y cargar exitosamente |
| En el límite exacto | Aceptar (valor límite) |
| 1 byte sobre el límite | Rechazar con mensaje claro |
| Archivo muy grande (1GB+) | Rechazar rápidamente |
| Archivo vacío (0 bytes) | Rechazar o aceptar según spec |
Testing de funcionalidad de carga
Progreso y feedback
- ¿Aparece barra de progreso durante la carga?
- ¿El porcentaje es preciso?
- ¿Se puede cancelar una carga en progreso?
- ¿Qué pasa si el usuario navega a otra página durante la carga?
Carga de múltiples archivos
- ¿Se pueden seleccionar múltiples archivos a la vez?
- ¿Hay un máximo de archivos?
- ¿Se pueden remover archivos individualmente antes del envío?
- ¿El tamaño total respeta el límite?
Drag and drop
- ¿Se pueden arrastrar archivos al área de carga?
- ¿La zona de drop se resalta cuando se arrastra un archivo?
- ¿Los archivos arrastrados se validan igual que los seleccionados?
Caracteres especiales en nombres de archivo
Prueba con estos patrones:
- Espacios:
mi documento.pdf - Unicode:
документ.pdf,档案.pdf - Caracteres especiales:
archivo (1).jpg - Nombres muy largos: 255+ caracteres
- Sin extensión:
README - Nombres reservados (Windows):
CON.txt,NUL.jpg
Testing de seguridad para cargas de archivos
Carga de archivos ejecutables
Intenta cargar archivos que podrían ejecutarse en el servidor:
.php,.asp,.jsp— scripts del servidor.html— podría contener JavaScript.svg— puede contener scripts embebidos.exe,.bat,.sh— ejecutables del sistema
Path traversal
Prueba nombres diseñados para escapar del directorio:
../../../etc/passwd..\\..\\windows\\system.ini
Testing de zip bomb
Una zip bomb es un archivo comprimido pequeño que se expande enormemente:
- Sube un zip de 1 KB que se expande a 1 GB+
- El servidor debería detectar y rechazar bombas de descompresión
Ejercicio: Auditoría de seguridad de carga de archivos
- Funcionalidad básica: Carga archivos válidos de cada tipo aceptado
- Bypass de tipo: Renombra un ejecutable con extensión de imagen — ¿se rechaza?
- Límites de tamaño: Carga un archivo justo sobre el límite
- Nombres especiales: Archivos con unicode, espacios y caracteres especiales
- Múltiples archivos: Carga el máximo, luego intenta uno más
- Cancelar y reintentar: Inicia una carga, cancela, reintenta
- Falla de red: Inicia carga y desconecta la red
| Test | Resultado | ¿Bug? | Severidad |
|---|---|---|---|
| .exe renombrado a .jpg | Cargado exitosamente | Sí | Crítica |
| 100 MB (límite: 10 MB) | Error solo después de carga completa | Sí | Media |
Nombre con ../ | Error 500 del servidor | Sí | Crítica |
Testing post-carga
Después de cargar un archivo:
- El archivo puede descargarse sin corrupción
- Se almacena de forma segura (no en directorio público)
- La URL no es predecible
- Imágenes servidas con Content-Type correcto
- Archivos no visualizables con
Content-Disposition: attachment
Puntos clave
- Las cargas de archivos son funcionalidades de alto riesgo de seguridad
- La validación del servidor debe verificar contenido real, no solo extensiones
- La validación de tamaño debería ser del lado del cliente
- Prueba nombres con caracteres especiales, unicode y path traversal
- Los archivos cargados no deben ser ejecutables en el servidor
- Prueba multi-archivo, drag-and-drop, progreso y cancelación