OWASP TOP 10: XML External Entities (XXE)

Llegamos al número cuatro del TOP 10 de vulnerabilidades web de OWASP, XML External Entities (XXE), no tan conocida como XSS o SQLi, quizás por la complejidad de su explotación o la falta de difusión, pero está en el TOP y vamos a tratar de explicarla y entenderla.

Hablaba sobre ataques conocidos como XSS y SQLi, pero la mayoría de los desarrolladores nunca han oído hablar de ataques más «oscuros», como es el caso de XML External Entities Injection, y sin embargo, un ataque de este tipo que esté bien realizado, puede ser tan devastador como la inyección más compleja y «agresiva» de XSS.

Primero vamos a entender la «anatomía» básica de un documento XML. Este tipo de documentos son utilizados para describir la estructura de los documentos, en este caso, de las páginas web. Por ejemplo, el siguiente documento XML podría describir una publicación de un blog:

<?xml version="1.0"?>
<post>
   <title> Ejemplo de documento XML </title>
   <author> Rafael Murillo - @cehrmurillo </author>
   <contenido>
      Este es nuestro archivo XML de ejemplo.
   </contenido>
</post>
En el documento anterior hay algunas piezas clave que tenemos que considerar. Primeramente, una etiqueta es un par de símbolos mayor que-menor que, que encierran un nombre. Por lo tanto <title> y <author>. Pero son más importantes aún los elementos lógicos del documento XML, en este caso uno de ellos es <author> Rafael Murillo – @cehrmurillo </author>.

Un ataque XXE funciona aprovechando una característica poco conocida de XML: External Entities. El concepto es el mismo que en el procesamiento interno de entidades, pero el vector de ataque consiste en poder utilizar recursos externos como texto de reemplazo. Vamos a ver el siguiente documento a manera de ejemplo:

<?xml version="1.0"?>
<!DOCTYPE passwd [ 
   <!ELEMENT passwd ANY>
   <!ENTITY passwd SYSTEM "file:///etc/passwd">
]>
<passwd> &passwd; </passwd>
Si analizamos el documento anterior, el elemento passwd va a contener a /etc/passwd.

En el sistema Linux, el contenido del fichero /etc/passwd determina quién puede acceder al sistema de manera legítima. Si una aplicación web acepta documentos XML creados por el usuario, un atacante puede usar la XML entities expansion para cargar archivos o recursos referenciables por URI.

Además, al cargar una secuencia de datos infinitos, como por ejemplo /dev/urandom, un atacante puede consumir todos los recursos de un sistema, denegando el acceso a otros usuarios.

1.- Un atacante captura la petición que hace por el método POST hacia el sitio http://example.com/xml y la modifica como se muestra en el ejemplo anterior.

2.- Si el ataque es existoso, en la misma aplicación que el atacante utilizó para enviar la petición por método POST podrá ver la respuesta del servidor, que ese nadad más y nada menos que el contenido del archivo que se solicitó, en este caso etc/lsb-release.
 
En conclusión podemos decir que el ataque a la vulnerabilidad XXE puede permitir el robo de información como archivos de un servidor o el código fuente de las aplicaciones.
 
Mitigación
Al tratarse de una vulnerabilidad más compleja que SQLi o XSS, su mitigación también resulta algo más complicada, pero básicamente se reduce a deshabilitar por completo las External Entities en XML. Para una mayor y mejor referencia, visita el sitio de OWASP dedicado a la mitigación de XXE.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *