XXE — Inyección de Entidad Externa XML
Parsers XML configurados para procesar referencias a entidades externas, permitiendo a atacantes leer archivos arbitrarios del servidor o disparar SSRF con un payload XML malicioso.
Cómo Funciona
XML soporta una función llamada entidades externas — referencias a archivos externos o URLs embebidas en el documento con `<!ENTITY`. Si el parser las resuelve, un atacante puede enviar XML como `<!ENTITY secreto SYSTEM 'file:///etc/passwd'>` y el servidor leerá y devolverá ese archivo. La mayoría de los parsers habilitan esto por defecto.
// MAL: parser XML con entidades externas habilitadas (por defecto)
import { parseStringPromise } from 'xml2js';
export async function POST(req: Request) {
const body = await req.text();
const data = await parseStringPromise(body); // resuelve entidades externas
return Response.json(data);
}// BIEN: deshabilita entidades externas
import { parseStringPromise } from 'xml2js';
export async function POST(req: Request) {
const body = await req.text();
// xml2js no soporta entidades externas, pero para parsers que sí:
const data = await parseStringPromise(body, {
explicitArray: false,
// Si usas libxmljs: pon noent: false
});
return Response.json(data);
}Ejemplo Real
XXE fue usado en el breach de Facebook de 2019 (via un sistema tercero) y en numerosos ataques empresariales. Está en el OWASP Top 10 y se encuentra frecuentemente en features de subida de documentos (los archivos DOCX, SVG y XLSX son XML por dentro).
Cómo Prevenirlo
- Deshabilita el procesamiento de entidades externas en la configuración de tu parser XML
- Usa un parser moderno que deshabilite entidades externas por defecto (xml2js, fast-xml-parser con configuración por defecto)
- Valida que los archivos subidos son lo que dicen ser antes de parsearlos
- Considera JSON en lugar de XML para APIs — no tiene esta clase de ataque
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Inyección LDAP
highInput del usuario insertado en filtros de búsqueda LDAP sin escapar, permitiendo a atacantes manipular queries de directorio, bypassear autenticación o extraer datos sensibles del directorio.
Inyección de Header HTTP (Inyección CRLF)
mediumInput controlado por el usuario incluido en headers de respuesta HTTP sin sanitizar, permitiendo a atacantes inyectar headers arbitrarios o dividir la respuesta en dos respuestas HTTP separadas.
Inyección de Header de Email
mediumInput del usuario sin sanitizar usado en los campos To, From, CC o Subject del email, permitiendo a atacantes inyectar destinatarios adicionales y convertir tu servidor de email en un relay de spam.
Inyección en Logs
lowInput provisto por el usuario escrito en logs sin sanitizar, permitiendo a atacantes falsificar entradas de log, ocultar sus huellas o inyectar contenido malicioso en archivos de log.