XXE Injection - XML Entity
XML significa "lenguaje de marcado extensible". XML es un lenguaje diseñado para almacenar y transportar datos.
Last updated
XML significa "lenguaje de marcado extensible". XML es un lenguaje diseñado para almacenar y transportar datos.
Last updated
¿Qué es XML?
XML significa "lenguaje de marcado extensible". XML es un lenguaje diseñado para almacenar y transportar datos. Al igual que HTML, XML utiliza una estructura de etiquetas y datos similares a árboles. A diferencia de HTML, XML no usa etiquetas predefinidas, por lo que las etiquetas pueden recibir nombres que describan los datos. Anteriormente en la historia de la web, XML estaba de moda como un formato de transporte de datos (el "X" en "AJAX" significa "XML"). Pero su popularidad ha declinado ahora a favor del formato JSON.
En esta sección explicaremos cuál es la inyección de la entidad externa XML, describiremos algunos ejemplos comunes, explicaremos cómo encontrar y explotar varios tipos de inyección XXE, y resumiremos cómo prevenir los ataques de inyección XXE.
Extensible Markup Languaje
: X-M-L
La inyección de entidad externa XML (también conocida como XXE) es una vulnerabilidad de seguridad web que permite a un atacante interferir con el procesamiento de datos XML de una aplicación. A menudo permite a un atacante ver archivos en el sistema de archivos del servidor de aplicaciones, e interactuar con cualquier sistema de back-end o externo al que la propia aplicación pueda acceder. En algunas situaciones, un atacante puede escalar un ataque XXE para comprometer el servidor subyacente u otra infraestructura de back-end, aprovechando la vulnerabilidad XXE para realizar ataques de falsificación de solicitud del lado del servidor (SSRF).
Algunas aplicaciones utilizan el formato XML para transmitir datos entre el navegador y el servidor. Aplicaciones que lo hacen virtualmente utilizan una biblioteca estándar o API de plataforma para procesar los datos XML en el servidor. Las vulnerabilidades XXE surgen porque la especificación XML contiene varias características potencialmente peligrosas, y los parsers estándar soportan estas características incluso si normalmente no son utilizados por la aplicación.
Las entidades XML son una forma de representar un elemento de datos dentro de un documento XML, en lugar de usar los datos en sí. Varias entidades están incorporadas a la especificación del lenguaje XML. Por ejemplo, las entidades <
y >
representan los personajes <
y >
. Estos son metacaracteres utilizados para denotar etiquetas XML, por lo que generalmente deben estar representados usando sus entidades cuando aparecen dentro de los datos.
La definición de tipo de documento XML (DTD) contiene declaraciones que pueden definir la estructura de un documento XML, los tipos de valores de datos que puede contener y otros ítems. La DTD se declara dentro de lo opcional DOCTYPE
elemento al inicio del documento XML. El DTD puede ser totalmente autónomo dentro del propio documento (conocido como "DTD interno") o puede ser cargado de otra parte (conocido como un "dTD externo") o puede ser híbrido de los dos.
XML permite definir entidades personalizadas dentro de la DTD. Por ejemplo:
Esta definición significa que cualquier uso de la referencia de la entidad &myentity;
dentro del documento XML se sustituirá por el valor definido: "my entity value
".
Las entidades externas XML son un tipo de entidad personalizada cuya definición se encuentra fuera de la DTD, donde se declaran.
La declaración de una entidad externa utiliza la SYSTEM
palabra clave y debe especificar una URL a partir de la cual se debe cargar el valor de la entidad. Por ejemplo:
La URL puede utilizar el file://
protocolo, y por lo tanto las entidades externas se pueden cargar desde el archivo. Por ejemplo:
Las entidades externas XML proporcionan los medios primarios por los que surgen ataques de entidad externa XML.
Las entidades externas XML basicamente son entidades personalizadas cuyos valores definidos se cargan por fuera de la DTD en el que se declaran.
Hay varios tipos de ataques XXE:
Explotando XXE para recuperar archivos, cuando una entidad externa se define conteniendo el contenido de un archivo, y devuelta en la respuesta de la aplicación.
Explotando XXE para realizar ataques SSRF, donde una entidad externa se define en base a una URL a un sistema de back-end.
Explotando a ciegas XXE exfiltrate datos fuera de banda, donde los datos sensibles se transmiten desde el servidor de aplicaciones a un sistema que el atacante controla.
Explotando a ciegas XXE para recuperar datos a través de mensajes de error, donde el atacante puede desencadenar un mensaje de error que contiene datos sensibles.
Para realizar un ataque de inyección XXE que recupera un archivo arbitrario desde el sistema de archivos del servidor, debe modificar el XML enviado de dos maneras:
Introducir (o editar) a DOCTYPE
elemento que define una entidad externa que contiene la ruta al archivo.
Edite un valor de datos en el XML que se devuelta en la respuesta de la aplicación, para hacer uso de la entidad externa definida.
Por ejemplo, supongamos que una aplicación de compra comprueba el nivel de existencias de un producto someto al servidor el siguiente XML:
La aplicación no realiza defensas particulares contra los ataques XXE, por lo que puede explotar la vulnerabilidad XXE para recuperar el /etc/passwd
archivo mediante la presentación de la carga útil XXE siguiente:
Esta carga útil define una entidad externa &xxe;
cuyo valor sea el contenido de la /etc/passwd
archivo y utiliza la entidad dentro de la productId
valor. Esto hace que la respuesta de la aplicación incluya el contenido del archivo:
Con vulnerabilidades XXE del mundo real, a menudo habrá un gran número de valores de datos dentro del XML presentado, cualquiera de los cuales podría ser utilizado dentro de la respuesta de la aplicación. Para probar sistemáticamente las vulnerabilidades XXE, generalmente necesitará probar cada nodo de datos en el XML individualmente, haciendo uso de su entidad definida y viendo si aparece dentro de la respuesta.
Aparte de la recuperación de datos sensibles, el otro impacto principal de los ataques XXE es que se pueden utilizar para realizar la falsificación de solicitudes de la parte del servidor (SSRF). Esta es una vulnerabilidad potencialmente grave en la que la aplicación del lado del servidor puede ser inducida para hacer solicitudes HTTP a cualquier URL a la que el servidor pueda acceder.
Para explotar una vulnerabilidad XXE para realizar un ataque SSRF, necesita definir una entidad XML externa usando la URL que desea dirigir y utilizar la entidad definida dentro de un valor de datos. Si puede utilizar la entidad definida dentro de un valor de datos
que se devuelve en la respuesta de la aplicación, entonces podrá ver la respuesta desde la URL dentro de la respuesta de la aplicación, y así obtener interacción bidentro con el sistema de back-end. Si no, entonces sólo podrá realizar ataques ciegos de la SSRF (que todavía pueden tener consecuencias críticas).
En el siguiente ejemplo XXE, la entidad externa hará que el servidor haga una solicitud HTTP de back-end a un sistema interno dentro de la infraestructura de la organización:
Muchos ejemplos de vulnerabilidades XXE son ciegos. Esto significa que la aplicación no devuelve los valores de ninguna entidad externa definida en sus respuestas, por lo que no es posible la recuperación directa de archivos del lado del servidor. Las vulnerabilidades ciegas XXE todavía se pueden detectar y explotar, pero se requieren técnicas más avanzadas. A veces puedes usar técnicas fuera de banda para encontrar vulnerabilidades y explotarlas para exfiltrar datos. Y a veces puede desencadenar errores de análisis XML que conducen a la divulgación de datos sensibles dentro de los mensajes de error.
Con esto queda claro entonces que las Blind XXE no se basan en lo que podamos añadir a los valores de datos llamando a la entidad externa ya que no mostrará nada (pero si lo añadimos igualmente con el fin de ver los posibles errores, o respuesta de XML directamente), en cambio tendremos que guiarnos por otras tecnicas, o analizando los tiempos a las solicitudes que hagamos. (Interacciones fuera de banda) burpcollaborator, exploit-server.
Las vulnerabilidades ciegas XXE surgen cuando la aplicación es vulnerable a la inyección XXE, pero no devuelve los valores de ninguna entidad externa definida dentro de sus respuestas. Esto significa que la recuperación directa de archivos del lado del servidor no es posible, por lo que el XXE ciego es generalmente más difícil de explotar que las vulnerabilidades XXE regulares.
Hay dos maneras amplias en las que puedes encontrar y explotar las vulnerabilidades de XXE ciegos:
Puede activar interacciones de red fuera de banda, a veces exfiltrando datos sensibles dentro de los datos de interacción.
Puede desencadenar errores de análisis de XML de tal manera que los mensajes de error contengan datos sensibles.
A menudo se puede detectar XXE ciego usando la misma técnica que para los ataques de XXE SSRF, pero desencadenando la interacción de red fuera de banda a un sistema que controla. Por ejemplo, definiría una entidad externa de la siguiente manera:
A continuación, haría uso de la entidad definida en un valor de datos dentro del XML. Este ataque XXE hace que el servidor haga una solicitud HTTP de back-end a la URL especificada. El atacante puede monitorear la solicitud de la luciendo DNS resultante y HTTP, y así detectar que el ataque XXE fue exitoso.
A veces, los ataques XXE con entidades regulares están bloqueados, debido a cierta validación de entrada por la aplicación o a algún endurecimiento del analizador XML que se está utilizando. En esta situación, es posible que pueda utilizar entidades de parámetros XML en su lugar. Las entidades de parámetros XML son un tipo especial de entidad XML que solo se puede hacer referencia a otra parte dentro de la DTD. Para los propósitos actuales, sólo necesitas saber dos cosas. En primer lugar, la declaración de una entidad de parámetro XML incluye el carácter porcentual antes del nombre de la entidad:
Y en segundo lugar, se hace referencia a las entidades de parámetros utilizando el carácter del porcentaje en lugar de los ampersand habituales:
Esto significa que puede probar para la persiana XXE utilizando la detección fuera de banda a través de entidades de parámetros XML de la siguiente manera:
Esta carga útil XXE declara una entidad de parámetro XML llamada xxe
y luego utiliza la entidad dentro de la DTD. Esto causará una mirada de DNS y una petición HTTP al dominio del atacante, verificando que el ataque fue exitoso.
Componentes Clave:
Los componentes fundamentales de AJAX incluyen:
JavaScript: Para manejar la lógica y manipular el DOM.
XMLHttpRequest: Para realizar las solicitudes HTTP.
XML o JSON: Para estructurar los datos intercambiados entre el cliente y el servidor.
Ejemplo de Uso:
Un ejemplo común es un sitio web de redes sociales donde las publicaciones nuevas se cargan dinámicamente sin recargar la página completa, mejorando así la fluidez y rapidez del sitio.
La detección de una vulnerabilidad de XXE ciego a través de técnicas fuera de banda está muy bien, pero en realidad no demuestra cómo se podría explotar la vulnerabilidad. Lo que un atacante realmente quiere lograr es exfiltrar datos sensibles. Esto se puede lograr a través de una vulnerabilidad ciega XXE, pero implica que el atacante alojar un DTD malicioso en un sistema que controlan, y luego invocando el DTD externo desde dentro de la carga útil XXE en banda.
Un ejemplo de DTD malicioso para exfiltrar el contenido de la /etc/passwd
archivo es el siguiente:
Esta DTD lleva a cabo los siguientes pasos:
Define una entidad de parámetro XML llamada file
, que contiene el contenido de la /etc/passwd
Archivo.
Define una entidad de parámetro XML llamada eval
, que contiene una declaración dinámica de otra entidad de parámetro XML llamada exfiltrate
. El exfiltrate
entidad será evaluada haciendo una solicitud HTTP al servidor web del atacante que contiene el valor de la file
entidad dentro de la cadena de consulta URL.
Utiliza el eval
entidad, que provoca la declaración dinámica de la exfiltrate
entidad a realizar.
Utiliza el exfiltrate
entidad, de modo que su valor se evalúa solicitando la URL especificada.
%
? que lo usamos en nuestros DTD de ataques :Bueno basicamente es la representación hexadecimal del simbolo %
como sabemos en los DTD cuando queremos nombrar una entidad parametro lo definimos como <!DOCTYPE foo [ <!ENTITY %xxe SYSTEM
ahi lo tengo en verde.
El atacante debe entonces albergar el DTD malicioso en un sistema que controlan, normalmente cargando en su propio servidor web. Por ejemplo, el atacante podría servir al DTD malicioso en la siguiente URL:
Por último, el atacante deberá presentar la siguiente carga útil XXE a la aplicación vulnerable:
Esta carga útil XXE declara una entidad de parámetro XML llamada xxe
y luego utiliza la entidad dentro de la DTD. Esto hará que el analizador XML alimente el DTD externo del servidor del atacante e interpretarlo en línea. Los pasos definidos dentro del DTD malicioso se ejecutan luego, y el /etc/passwd
El archivo se transmite al servidor del atacante.
Esta técnica podría no funcionar con algunos contenidos de archivos, incluyendo los nuevos caracteres de línea contenidos en el
/etc/passwd
Archivo. Esto se debe a que algunos parsers XML obtienen la URL en la definición de entidad externa usando una API que valida los caracteres que se permiten aparecer dentro de la URL. En esta situación, podría ser posible utilizar el protocolo FTP en lugar de HTTP. A veces, no será posible exfiltrar los datos que contienen nuevos caracteres, y por lo tanto un archivo como/etc/hostname
puede ser el objetivo en su lugar.
ATTACKS
:Un enfoque alternativo para explotar la persiana XXE es desencadenar un error de parsing XML donde el mensaje de error contiene los datos sensibles que desea recuperar. Esto será eficaz si la aplicación devuelve el mensaje de error resultante dentro de su respuesta. Puede activar un mensaje de error de análisis XML que contiene el contenido del /etc/passwd
Archivo usando un DTD externo malicioso de la siguiente manera:
Esta DTD lleva a cabo los siguientes pasos:
Define una entidad de parámetro XML llamada file
, que contiene el contenido de la /etc/passwd
Archivo.
Define una entidad de parámetro XML llamada eval
, que contiene una declaración dinámica de otra entidad de parámetro XML llamada error
. El error
entidad será evaluada cargando un archivo inexistente cuyo nombre contenga el valor de la file
entidad.
Utiliza el eval
entidad, que provoca la declaración dinámica de la error
entidad a realizar.
Utiliza el error
entidad, de modo que su valor se evalúa intentando cargar el archivo inexistente, resultando en un mensaje de error que contiene el nombre del archivo inexistente, que es el contenido de la /etc/passwd
Archivo.
Invocar el DTD externo malicioso resultará en un mensaje de error como el siguiente:
La técnica anterior funciona bien con un DTD externo, pero normalmente no funcionará con un DTD interno que está completamente especificado dentro de la DOCTYPE
elemento. Esto se debe a que la técnica implica el uso de una entidad de parámetro XML dentro de la definición de otra entidad de parámetro. Según la especificación XML, esto está permitido en DTD externos, pero no en DTDs internos. (Algunos paristas pueden tolerarlo, pero muchos no.)
Así que qué pasa con las vulnerabilidades ciegas de XXE cuando las interacciones fuera de banda están bloqueadas? No puedes exfiltrar los datos a través de una conexión fuera de banda, y no puedes cargar un DTD externo desde un servidor remoto.
En esta situación, todavía podría ser posible activar los mensajes de error que contienen datos sensibles, debido a una laguna en la especificación del lenguaje XML. Si el DTD de un documento utiliza un híbrido de declaraciones DTD internas y externas, entonces el DTD interno puede redefinir las entidades que se declaran en el DTD externo. Cuando esto sucede, la restricción de usar una entidad de parámetro XML dentro de la definición de otra entidad de parámetro se relaja.
Esto significa que un atacante puede emplear la técnica XXE basada en errores dentro de un DTD interno, siempre que la entidad del parámetro XML que utilizan esté redefiniendo una entidad que se declara dentro de una DTD externa. Por supuesto, si las conexiones fuera de banda están bloqueadas, entonces el DTD externo no se puede cargar desde una ubicación remota. En su lugar, debe ser un archivo DTD externo que sea local para el servidor de la aplicación. Esencialmente, el ataque implica invocar un archivo DTD que sucede en el sistema de archivos local y repurposarlo para redefinir una entidad existente de una manera que desencadene un error de parsing que contiene datos sensibles. Esta técnica fue pionera por Arseniy Sharoglazov, y se clasió al puesto 7 en nuestras 10 mejores técnicas de hacking web de 2018.
Por ejemplo, supongamos que hay un archivo DTD en el sistema de archivos del servidor en la ubicación /usr/local/app/schema.dtd
, y este archivo DTD define una entidad llamada custom_entity
. Un atacante puede activar un mensaje de error de pareding XML que contiene el contenido del /etc/passwd
archivo mediante la presentación de un DTD híbrido como el siguiente:
Esta DTD lleva a cabo los siguientes pasos:
Define una entidad de parámetro XML llamada local_dtd
, que contiene el contenido del archivo DTD externo que existe en el sistema de archivos del servidor.
Redefinas de la entidad del parámetro XML llamada custom_entity
, que ya está definido en el archivo DTD externo. La entidad se redefine como que contiene el exploit XXE basado en errores que ya fue descrito, para activar un mensaje de error que contiene el contenido de la /etc/passwd
Archivo.
Utiliza el local_dtd
entidad, de modo que se interprete el DTD externo, incluido el valor redefinido de la custom_entity
entidad. Esto resulta en el mensaje de error deseado.
&#x25;
o '
?Bueno basicamente son caracteres codificados a hexadecimal para el procesamiento en el XML, el desglose de que son va así:
%
:
Esta es la representación hexadecimal del carácter %
.
En ASCII, el valor decimal de %
es 37, y su representación hexadecimal es 25.
Por lo tanto, %
se traduce directamente como el carácter %
.
&#x25;
:
Esta entidad es un poco más compleja. Se descompone en dos partes:
&
: Esto representa el carácter &
(ampersand). En hexadecimal, el valor para &
es 26.
#x25
: Esto representa el carácter %
, como se explicó anteriormente.
Juntas, forman la cadena &%
, que se utiliza en el contexto del código para construir una declaración dinámica de la entidad parametro que se invoca dentro de la definición de la entidad parametro.
'
:
Esta entidad representa el carácter '
(apóstrofe o comilla simple).
En ASCII, el valor decimal de '
es 39, y su representación hexadecimal es 27.
Por lo tanto, '
se traduce directamente como el carácter '
por ejemplo SYSTEM 'file:///etc/passwd'
son esas comillas simples.
Dado que este ataque XXE implica la reutilización de un DTD existente en el sistema de archivos del servidor, un requisito clave es localizar un archivo adecuado. Esto es realmente bastante sencillo. Debido a que la aplicación devuelve cualquier mensaje de error lanzado por el analizador XML, puede enumerar fácilmente archivos DTD locales con solo intentar cargarlos desde dentro del DTD interno.
Por ejemplo, los sistemas Linux que utilizan el entorno de escritorio GNOME a menudo tienen un archivo DTD en /usr/share/yelp/dtd/docbookx.dtd
. Puede probar si este archivo está presente presentando la siguiente carga útil XXE, lo que causará un error si el archivo falta:
Después de haber probado una lista de archivos DTD comunes para localizar un archivo que está presente, entonces debe obtener una copia del archivo y revisarlo para encontrar una entidad que pueda redefinir. Dado que muchos sistemas comunes que incluyen archivos DTD son de código abierto, normalmente puede obtener rápidamente una copia de archivos a través de la búsqueda en Internet.
Las vulnerabilidades de la superficie de ataque para la inyección XXE son obvias en muchos casos, porque el tráfico HTTP normal de la aplicación incluye solicitudes que contienen datos en formato XML. En otros casos, la superficie del ataque es menos visible. Sin embargo, si usted mira en los lugares correctos, usted encontrará la superficie de ataque XXE en las solicitudes que no contienen ningún XML.
X Include attack
Algunas aplicaciones reciben datos enviados por el cliente, incrustarlos en el lado del servidor en un documento XML y luego analizar el documento. Un ejemplo de esto ocurre cuando los datos enviados por el cliente se colocan en una solicitud SOAP de back-end, que luego es procesada por el servicio SOAP backend.En esta situación, no se puede llevar a cabo un ataque clásico XXE, porque no controla todo el documento XML y por lo tanto no puede definir o modificar un DOCTYPEelemento. Sin embargo, usted podría ser capaz de utilizar XIncludeEn vez de eso. XIncludees una parte de la especificación XML que permite construir un documento XML a partir de subdocumentos. Puedes colocar un XIncludeataque dentro de cualquier valor de datos en un documento XML, por lo que el ataque se puede realizar en situaciones en las que solo controla un único elemento de datos que se coloca en un documento XML del lado del servidor.Para realizar un XIncludeataque, tienes que hacer referencia a la XIncludenamespace y proporcione la ruta al archivo que desea incluir. Por ejemplo:
Algunas aplicaciones permiten a los usuarios cargar archivos que luego se procesan en el lado del servidor. Algunos formatos de archivo comunes utilizan XML o contienen subcomponentes XML. Ejemplos de formatos basados en XML son formatos de documentos de oficina como DOCX y formatos de imagen como SVG.
Por ejemplo, una aplicación puede permitir a los usuarios subir imágenes, procesarlas o validarlas en el servidor después de subirlas. Incluso si la aplicación espera recibir un formato como PNG o JPEG, la biblioteca de procesamiento de imágenes que se está utilizando podría soportar imágenes SVG. Dado que el formato SVG utiliza XML, un atacante puede enviar una imagen SVG maliciosa y así alcanzar la superficie de ataque oculta para vulnerabilidades XXE.
Content-Type
La mayoría de las solicitudes de POST utilizan un tipo de contenido predeterminado que se genera por formularios HTML, tales como application/x-www-form-urlencoded
. Algunos sitios web esperan recibir solicitudes en este formato, pero tolerarán otros tipos de contenido, incluyendo XML.
Por ejemplo, si una solicitud normal contiene lo siguiente:
Entonces podría presentar la siguiente solicitud, con el mismo resultado:
Si la aplicación tolera solicitudes que contienen XML en el cuerpo del mensaje, y analiza el contenido del cuerpo como XML, entonces puede llegar a la superficie de ataque XXE oculta simplemente reformatando las solicitudes para usar el formato XML.