Vulnerabilidad de Entidad externa XML
Para poder entender la vulnerabilidad de Entidad externa XML, también llamada Ataque de inyección XXE, primero debemos saber el funcionamiento básico del formato XML en la web. Por tanto, en este apartado primero explicaremos una breve introducción a su función y luego describiremos en detalle los tipos de ataque XXE.
Table of Contents
Toggle¿Qué es XML?
El Lenguaje de marcado Extensible (XML), es similar a HTML con la diferencia que este se usa para diseñar y visualizar páginas web en los navegadores. Mientras que XML es usado solo para el transporte y almacenamiento de datos.
Veamos un ejemplo de sintaxis:
<?xml version=»1.0″ encoding=»UTF-8″?>
Seguramente habrás visto esto en el encabezado de algún código HTML. Esto es lo que se conoce como “XML Prolog”, sin embargo no es obligatorio que deba estar en documentos XML. Estos documentos deben contener un elemento “raiz” o tambien llamado “root”. Por jemplo:
<mail>
<nombre-completo>Juan Pedro</nombre-completo>
<direccion>
<calle> Los Rosales</calle>
<ciudad>Lujan</ciudad>
<código-postal>0434</código-postal>
</direccion>
<tel =»true»> 1579343202</tel>
</mail>
El elemento “mail” es el elemento raiz, mientras que los demas (nombre-completo,dirección,calle, etc) son elementos secundarios ,o atributos, con sus valores (“Juan Pedro”, “Los Rosales”,”Lujan”, etc).
Para resumir:
El documento debe tener un solo elemento root o raíz.
Todas las etiquetas o tags abiertas deben tener sus respectivas etiquetas de cierre.
XML es un lenguaje “key sensitive”, distingue mayúsculas de minúsculas, por lo que todos los elementos y atributos deben seguir la definición.
Entonces, podemos decir que usamos XML por sus beneficios, porque es independiente de la plataforma y del lenguaje de programación que se use, puede simplificar los datos almacenados y transportados ya que esto no afecta la presentación y conversión de los mismos, y especialmente porque puede ser validado mediante DTD y Schema. Ahora bien para que un documento pueda ser validado, es decir, estar libre de errores de sintaxis debe usarse DTD y schema como mencionamos anteriormente.
Uso de DTD
La DTD (Definicion de Tipo de Documento) es la encargada de definir la estructura (usamos !DOCTYPE para señala la raiz) y elementos (!ELEMENT, !ATTLIST, !ENTITY, !NOTATION) de un documento XML.
ELEMENTOS
!ELEMENT define un elemento.
!ATTLIST define un atributo.
!ENTITY define una entidad.
!NOTATION define una notación.
TIPOS DE ELEMENTOS
PCDATA describe un tipo de carácter alfanumérico. Por ejemplo:
<!ElEMENT nombre (#PCDATA)>
CON “HIJOS” describe las caractericticas de un dato. Por ejemplo:
<!ELEMENT persona (correo*,tel+,dir?)>
El asterisco “*” significad que “correo” puede aparecer cero o varias veces.
El signo “+” significa que “teléfono” puede aparecer una o varias veces.
El sigo “?” significa que la dirección puede aparecer cero o una vez.
EMPTY describe un tipo de elemento vacío. Por ejemplo:
<!ELEMENT gobierno (EMPTY)>
<gobierno/>
ANY describe cualquier carácter, letras, números, tipo de signos, etc. Por ejemplo:
<!ELEMENT velocidad (ANY)>
DECLARACIONES:
Estas puede ser “Internas o Externas”
Declaración Interna – Sintaxis:
<?xml version=»1.0″ encoding=»UTF-8″?>
<!DOCTYPE (elemento raíz) [DTD]>
SEGUIDO DEL DOCUMENTO. Por ejemplo:
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<!DOCTYPE Hectarea [
<!ELEMENT terreno (Casa)*>
<!ELEMENT Casa (Dirección, Descripción, Estado, Tamaño)>
<!ELEMENT Dirección (#PCDATA) >
<!ELEMENT Descripción (#PCDATA) >
<!ELEMENT Estado (#PCDATA) >
<!ELEMENT Tamaño (#PCDATA) >
]
Luego guardamos y validamos este documento con el nombre Hectarea.dtd
Declaración Externa – Sintaxis:
<?xml version=»1.0″ encoding=»UTF-8″?>
<!DOCTYPE terrenos SYSTEM [Hectarea.dtd]>
SEGUIDO DEL DOCUMENTO:
<terreno>
<casa>
<Direccion>Avenida El Libertador </Direccion>
<Descripcion>Dos hambientes y patio</Descripcion>
<Estado>buen estado</Estado>
<Tamaño>75X60 m2</Tamaño>
</casa>
….
</terreno>
En esta declaración estamos usando nuestro código anterior para ampliarlo o establecer alguna modificación. Con esto nos ahorramos de no volver a escribir todo el código otra vez. En caso de querer usar un código público en vez de poner SYSTEM pondremos PUBLIC.
Vulnerabilidad XXE
La Vulnerabilidad de Entidad externa XML consiste en una inyección de código mediante una Entidad XML en los endpoint de un servidor, vulnerando así, los datos confidenciales del sistema.
En este caso el cliente (atacante) realiza una petición al servidor, cuyo contenido es una definición externa del mensaje (DTD externa), que le permite extraer datos, realizar una falsificación del lado del servidor (SSRF), e incluso poder causar un ataque de denegación de servicio (DOS). Estos ataques afectan a aquellos servicios que utilizan el lenguaje XML, como formato de mensajería, a diferencia del formato web HTML. Ocurre tanto en aplicaciones web y APIs como también en microservicios.
¿Cómo ocurre esto?
La vulnerabilidad de Entidad externa XML se presenta cuando dejamos que la definición de tipo de datos (DTD) permita con total libertad o confianza la interacción entre cliente y servidor, ya que por default lo permite. Sin embargo, no todo cliente es de confianza y aquí entra en juego el rol del atacante estableciendo peticiones que se salten los controles del servidor en última instancia, dando lugar a graves infracciones en la confidencialidad, integridad y disponibilidad de los datos (Pilares de la seguridad informática).
El origen de estos ataques se debe a una mala configuración, o falta de sanitización, del servidor por parte del backend o desarrolladores en los analizadores/datos XML por parte de DTD
Tipos de ataques XXE
La vulnerabilidad de Entidad externa XML sucede de dos formas diferentes. De las cuales podemos mencionar:
DENTRO DE BANDA
Un ataque dentro de banda es aquel en el que el atacante puede recibir una respuesta inmediata por parte de la carga útil (payload) utilizada.
FUERA DE BANDA
Un ataque fuera de banda, o ataque a ciegas XXE, ocurre cuando el atacante no posee una respuesta inmediata por parte del servidor y tiene que establecer una salida de su carga útil en un archivo externo o su propio servidor. Estaremos indagando sobre este tipo de ataque en la siguiente página.
En este apartado estaremos indagando sobre los tipos de ataques que se dan en «Dentro de Banda».
Veamos algunos ejemplos:
1) Como podemos ver estamos usando un “ENTITY” (Entidad) llamada “mensaje” y asignándole un valor “Hola”. Ejecutando estas simples líneas podemos darnos una idea de la vulnerabilidad que posee.
<!DOCTYPE root [<!ENTITY mensaje “Hola”>]>
<root>&mensaje;</root>
Out:
Hola
2) También, podemos acceder a un archivo confidencial definiendo un ENTITY usando la pabra SYSTEM. Es decir, estamos definiendo una entidad pero configurando su valor en “sistema” y estableciendo la ruta del archivo. Cuyo wrapper es “file:// + Ruta_del_archivo”
<!DOCTYPE root [<!ENTITY info SYSTEM “file: ///etc/passwd”>]>
<root>&info;</root>
(Como resultado obtendríamos una lista de los usuarios del sistema).
Máquina en TryHackme
Como podemos ver estamos conectados a la máquina 10.10.44.8
Ahora bien, colocaremos la siguiente carga útil para saber si dicho sitio web nos permite la ejecución de comandos a través de XML:
Podemos ver, nos devuelve la “feast” como resultado de la ejecución &name;. Es decir, tenemos los nombres de usuario como resultado. Entonces, en base a esto, podríamos ir probando otros wrappers para ir obteniendo más información. Por ejemplo:
Vemos que nos ha traído lo que buscábamos. A través de la entidad “xxe” hemos obtenido el contenido del archivo /etc/passwd. El cual, contiene el nombre de todos los usuarios del sistema. Sabiendo esto, podemos obtener la clave privada id_rsa de algún usuario. Por ejemplo, para el usuario “falcon”, podríamos buscarla a través del archivo /home/falcon/.ssh/id_rsa. Veamos esto a continuación:
Recordemos que, luego de tener resultado, podemos visualizarlo de una mejor forma con Ctrl+u.
Luego podríamos usar dicha llave privada para acceder a traves de ssh como usuario “falcon”.
3) Ahora veremos como realizar una denegación de servicio llamada “Billions Laughts”
<!DOCTYPE root [
<!ENTITY ha1 “HA!”>
<!ENTITY ha2 “&ha1 ; &ha;”>
<!ENTITY ha3 “&ha2 ; &ha2;”>
<!ENTITY ha4 “&ha3 ; &ha3;”>
….
<!ENTITY ha130 “&ha129 ; &ha129;”>]>
<root>&ha130;</root>
En este ejemplo se puede apreciar como producimos un tiempo de crecimiento exponencial del lado del servidor. En otras palabras, se puede observar que una vez completada las 130 entidades <ha>, la ejecución del documento produciría 2^130 impresiones del mensaje <Ha!>. Unas pocas de estas peticiones pueden hacer caer fácilmente un servidor.