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 Entitties 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.
</ content>
</ post>
En el documento anterior hay algunas piezas clave que tenemos que considerar. Primeramente, por si no lo sabes, 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 (o GNU/Linux para los puristas), el contenido del fichero /etc/passwd determina quien puede acceder al sistema de manera legitima y qué se puede hacer una vez dentro del sistema. Este fichero es la primera linea de defensa del sistema contra accesos no deseados.
Si una aplicación web acepta documentos XML creados por el usuario como datos de entrada, un atacante puede usar la XML entitiese expansion para cargar archivos u otros recursos referenciables por URI en la aplicación web. Si esta información luego se muestra de nuevo al atacante, entonces ellos mismos podrán filtrar la información posiblemente privilegiada.
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.
Si bien la vulnerabilidad XML External Entities no es un error complicado, es difícil de probar. Hay tantas variables involucradas en el lanzamiento de un ataque exitoso que normalmente un pentester o consultor en seguridad, simplemente no se toma el tiempo para invertir en realizar este tipo de ataques en una auditoria.
Vamos a ver un ejemplo en la siguiente imagen de la explotación de esta vulnerabilidad.
1.- Un atacante captura la petición que hace por el método POST hacia el sitio http://example.com/xml antes de ser enviada y la modifica de tal manera que quede como se muestra en la parte izquierda de la siguiente imagen.
Nota.- La captura de la petición la puede hacer mediante un proxy como Burpsuite o mediante algún complemento de navegador como Live HTTP Headers.
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.
Comentarios
Publicar un comentario