Los peligros de los ataques XML External Entity (XXE)

By albert
11 Abr 2019

Las vulnerabilidades de tipo XML External Entity (XXE), suelen ser poco conocidas pese a su importancia. Según el top 10 de OWASP (2017), esta vulnerabilidad se encuentra en el cuarto puesto.

Entonces, ¿Qué es un XXE?

Un XXE es una inyección de código en una aplicación que analiza datos XML. Esto no quiere decir que si tu aplicación no devuelve datos XML en la respuesta, no sea vulnerable, ya que si en la aplicación, no está configurado el tipo de datos que se quiere recibir, el atacante puede enviar los datos en formato XML y que la aplicación los analice.
La inyección ocurre mediante un concepto llamado entidad que almacena cualquier tipo de dato. Esta entidad, funciona como el termino conocido en programación de variable. La entidad, puede también acceder al contenido local o remoto a través de declarar un identificador del sistema donde éste puede acceder a una URI cuando se procesa la entidad.
La vulnerabilidad explota este acceso a una URI de tal forma que se puede acceder a ficheros del sistema e incluso hacer peticiones externas desde la máquina que procesa la entidad.
Solo se obtendrá una respuesta si, y solo si, todo el proceso en el análisis del XML obtenido por la aplicación es correcto. Por lo tanto, si una URI, no es accesible, la aplicación devolverá un estatus diferente de 200, en cambio si es accesible, devolverá un estatus 200.

Tipos de ataques XXE

– XXE In-Band: Creación de una entidad accediendo a la URI y devolviendo el contenido en la respuesta.
– XXE Out-Of-Band: Creación de una entidad accediendo a la URI y exfiltrando estos datos externamente, ya sea por DNS, FTP, HTTP, …

Impacto en el servicio

Es muy importante realizar auditorías de ciberseguridad para evitar que un atacante pueda encontrar esta vulnerabilidad, ya que podría realizar algunas de las siguientes acciones:
Exfiltración de información crítica: Al ser posible el acceder a contenido local, el atacante puede exfiltrar la información de un archivo como /etc/passwd, ya sea mediante una respuesta del servidor o una conexión FTP enviando peticiones con el contenido de éste. De esta manera, el atacante obtendrá por ejemplo los usuarios utilizados en el servidor que analiza el contenido XML.
Enumeración de puertos abiertos: El atacante puede enviar peticiones a través de la entidad hacia otro servidor y ver si esta petición devuelve una respuesta o no, dependiendo de la respuesta el puerto estará abierto o cerrado.
Enumeración de dominios e ips internos: De la misma manera que el atacante puede enumerar puertos abiertos, puede enumerar dominios e ips internas correctas.
Exfiltración de credenciales: Al poder exfiltrar información de archivos, el atacante puede elegir ir a por ficheros conocidos con credenciales, ya sea /etc/shadow o una llave privada en el directorio de ssh. De esta manera, si el servicio también tiene abierto el servicio ssh puede llegar a obtener acceso a la máquina.
Exfiltración de información interna mediante peticiones conocidas internas: El atacante puede hacer peticiones a servicios internos como, por ejemplo, acceder a la página de estatus de un servidor Apache y recibir el contenido de esta. Con este contenido, puede llegar a ver más peticiones internas y poder llegar a exfiltrar información importante para la empresa.
Denegación de servicio: Hay distintos métodos para hacer una denegación de servicio en el sistema, una de ellas es la repetición recursiva de llamadas del sistema.
Ejecución de código: Si, y solo si, el servidor tiene el módulo expect de PHP, el atacante puede llegar a ejecutar código en la entidad y obtener la respuesta de éste, o incluso, ganar acceso a una máquina a través de la ejecución de código.

Limitaciones de la exfiltración de datos

La vulnerabilidad de XXE, tiene una limitación. Al añadir contenido en la petición a la aplicación, en la declaración de las entidades, no es posible añadir algunos caracteres. Los más importantes personalmente son “<” y “>”, porque sin ellos en un XXE In-Band, toda la parte de exfiltración de datos que contienen estos caracteres es imposible.
Por suerte, o mala suerte dependiendo del punto de vista, si la aplicación es PHP, se puede utilizar el módulo filter para codificar el contenido con los caracteres prohibidos a base64 y de esta manera, lo único que tendrá que hacer el atacante, será decodificar el base64 y obtener el contenido del XML o HTML.
A parte de este método, también hay otras formas de codificar estos caracteres, estas formas más típicas las podemos ver en los Cheat Sheet de OWASP.

Como protegerse

La mejor manera para prevenir este tipo de ataques es, si no se utilizan, deshabilitar completamente los “Document Type Definitions” (DTDs) y validar siempre todos los inputs y outputs que la aplicación utiliza.
———
Autor: Mario Sala

Los comentarios están cerrados.