Ataques XXE: ejemplos de explotación, variantes y cómo protegerse de la expansión de entidades XML

Ataques XXE: ejemplos de explotación, variantes y cómo protegerse de la expansión de entidades XML

XML todavía se utiliza en aplicaciones, servicios web y antiguos sistemas empresariales. Junto con ello vienen numerosos problemas. Una de las vulnerabilidades más conocidas está relacionada con el tratamiento de entidades — Entidad externa de XML (XXE). Aunque se describió hace muchos años, todavía aparece con regularidad y a menudo es aprovechada por atacantes. Analizaremos qué es esta vulnerabilidad, sus variantes y cómo protegerse.

Qué es XML y para qué sirven las entidades

XML (lenguaje de marcas extensible) almacena datos en una estructura jerárquica. Para no repetir fragmentos de texto, en XML se pueden declarar entidades. Una entidad es parecido a una variable: se define en el DTD (Document Type Definition) y luego se utiliza muchas veces.

Ejemplo de una entidad sencilla:

<!DOCTYPE example [
  <!ENTITY hello "¡Hola, mundo!">
]>

<root>
  <message>&hello;</message>
</root>

Al procesar el documento, el analizador sustituirá &hello; por la cadena «¡Hola, mundo!». Es cómodo, pero esa mecánica se convierte en una vía para ataques.

Cómo funciona un ataque XXE

El XXE se basa en que el analizador XML confía en el documento de entrada y permite entidades externas. Una entidad externa es una referencia a un recurso externo: un archivo local o una dirección de red. Si la aplicación no desactiva esta posibilidad, un atacante puede hacer que el servidor cargue datos desde cualquier lugar.

Ejemplo de XML malicioso:

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>

El parser intentará sustituir con el contenido del archivo /etc/passwd. Si el resultado se muestra al usuario o se registra en algún sitio, el atacante obtiene acceso a información confidencial.

Escenarios típicos de explotación

  • Lectura de archivos locales del servidor.
  • Eludir la autenticación mediante la suplantación de datos.
  • Realizar peticiones a servicios internos (SSRF — Server-Side Request Forgery).
  • Denegación de servicio por crecimiento exponencial de las entidades.

Variantes de XXE

Según la configuración del analizador, el XXE puede utilizarse de distintas maneras. Los atacantes combinan técnicas para obtener diferentes resultados.

Ataque "Billion Laughs"

Ataque DoS basado en la definición recursiva de entidades. Un archivo XML pequeño se convierte en un flujo de datos gigantesco que agota la memoria del servidor.

<!DOCTYPE lolz [
  <!ENTITY lol "lol">
  <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
  ... ]>

Esta técnica también se conoce como bomba XML.

SSRF mediante XXE

Si se permiten llamadas de red, el XXE se convierte fácilmente en SSRF. El servidor comienza a realizar peticiones a servicios internos o direcciones externas. Esto permite mapear la infraestructura y a veces eludir protecciones.

Ejemplo:

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://127.0.0.1:8080/admin">
]>
<root>&xxe;</root>

XXE ciego

Cuando el contenido del archivo no aparece directamente en la respuesta, se usa el XXE ciego. Los datos se codifican en peticiones de red que van al servidor del atacante. Así recopila filtraciones desde los registros.

Cómo detectar XXE

Se pueden comprobar los sistemas manualmente o con herramientas:

  • Burp Suite — modificación de peticiones XML y análisis de respuestas.
  • OWASP ZAP — escáner de vulnerabilidades gratuito.
  • RequestBin — captura de peticiones SSRF.

Los indicadores de vulnerabilidad incluyen:

  1. Retrasos en las respuestas al modificar el XML.
  2. Errores del analizador.
  3. Peticiones de red inesperadas desde la aplicación.

Cómo protegerse del XXE

Lo principal es desactivar el soporte de entidades externas en el analizador. También existen medidas adicionales.

Medidas básicas

  • Prohíba DOCTYPE y las entidades externas.
  • Use bibliotecas que por defecto bloqueen XXE.
  • Filtre los datos entrantes.
  • Limite el acceso de la aplicación al sistema de archivos y a las redes internas.

Ejemplos en código

Java:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Python (lxml):

from lxml import etree
parser = etree.XMLParser(resolve_entities=False)

XXE en la actualidad

El XXE sigue figurando en la lista OWASP Top 10. Aparece en informes de ciberseguridad porque los desarrolladores frecuentemente usan configuraciones inseguras por defecto o analizadores antiguos.

XML todavía se utiliza en servicios bancarios, API SOAP e integraciones. Donde JSON ha ganado terreno, XXE es menos frecuente, pero no ha desaparecido por completo.

Conclusión

XXE es un ejemplo de cómo una función útil se convierte en una amenaza. Revisar los sistemas para esta vulnerabilidad y configurar correctamente el analizador puede prevenir incidentes graves. Si trabaja con XML, asegúrese de que las entidades externas estén desactivadas. Esta acción sencilla puede cerrar una gran brecha de seguridad.

Alt text