Discrepancia de Tipo MIME
Validar el tipo de archivo solo por extension en vez de contenido permite a los atacantes subir archivos maliciosos con extensiones renombradas, bypasseando controles de seguridad.
Cómo Funciona
Muchas aplicaciones verifican tipos de archivo mirando la extension (.jpg, .pdf) o el header Content-Type enviado por el navegador. Ambos pueden ser falsificados trivialmente. Un atacante puede renombrar malware.exe a invoice.pdf o configurar el Content-Type como image/jpeg para un web shell PHP. El servidor acepta el archivo pensando que es seguro. Cuando el archivo se sirve o procesa despues, el contenido real determina el comportamiento — un archivo PHP con extension .jpg puede aun ejecutarse si el servidor esta mal configurado. La validacion correcta requiere leer los magic bytes del archivo (los primeros bytes que identifican el formato) para determinar el tipo de contenido real.
app.post('/upload', upload.single('doc'), (req, res) => {
const ext = path.extname(req.file.originalname).toLowerCase();
const allowed = ['.pdf', '.docx', '.xlsx'];
if (!allowed.includes(ext)) {
return res.status(400).json({ error: 'Invalid file type' });
}
// File accepted based on extension only
res.json({ url: `/docs/${req.file.filename}` });
});const { fileTypeFromBuffer } = require('file-type');
app.post('/upload', upload.single('doc'), async (req, res) => {
const buffer = fs.readFileSync(req.file.path);
const type = await fileTypeFromBuffer(buffer);
const allowed = ['application/pdf',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
if (!type || !allowed.includes(type.mime)) {
fs.unlinkSync(req.file.path);
return res.status(400).json({ error: 'Invalid file type' });
}
res.json({ url: `/docs/${req.file.filename}` });
});Ejemplo Real
En 2019, WhatsApp tenia una vulnerabilidad (CVE-2019-11931) donde los atacantes enviaban archivos MP4 especialmente construidos que en realidad eran payloads de exploit. El cliente validaba la extension pero no el contenido, permitiendo ataques de buffer overflow que podian ejecutar codigo arbitrario en el dispositivo del receptor.
Cómo Prevenirlo
- Usa la libreria file-type para detectar el tipo real del archivo desde los magic bytes
- Nunca confies en extensiones de archivo o headers Content-Type enviados por el cliente
- Elimina archivos inmediatamente si la validacion de contenido falla
- Configura el header X-Content-Type-Options: nosniff para prevenir MIME sniffing del navegador
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Travesia de Ruta
highRutas de archivos construidas con input de usuario sin validar permiten a los atacantes leer o escribir archivos arbitrarios en el servidor usando secuencias ../.
Carga de Archivo sin Validacion
highAceptar cargas de archivos sin verificar tipo, tamano o contenido permite a los atacantes subir ejecutables maliciosos, web shells o archivos sobredimensionados que crashean el servidor.
SVG con JavaScript
mediumAceptar cargas de SVG sin sanitizacion permite a los atacantes embeber JavaScript en archivos SVG, habilitando ataques XSS cuando el SVG se renderiza en un navegador.
EXIF No Eliminado
lowImagenes servidas sin eliminar metadatos EXIF pueden filtrar coordenadas GPS, informacion del dispositivo, timestamps y otros datos sensibles de la persona que tomo la foto.