XXE (inyección de entidades externas XLM) es otro tipo de atque del TOP 10 de la OWASP que permite a un atacante realizar una acción maliciosa a través de una subida de ficheros XML (a grosso modo).
A través de este ataque, se pueden ver archivos del sistema, explotar un SSRF (puedes leer esto si no lo ha hecho aun), etc.
Imagen “cedida amablemente” por la gente de Portswigger
Algunas web hacen uso de ficheros XML para realizar la transmisión de datos entre navegador y servidor. Por ejemplo, imagina una web en la que te permite subir ficheros XML con datos para que luego esos datos aparezcan en dicha web. Si la web no tiene bien parametrizada esa subida, puede ocasionar graves riesgos.
Según indica la gente de portswigger en su blog, existen varios tipos de atques XXE.
Explotación de XXE para recuperar archivos , donde se define una entidad externa que contiene el contenido de un archivo y se devuelve en la respuesta de la aplicación.
Explotación de XXE para realizar ataques SSRF , donde se define una entidad externa basada en una URL a un sistema back-end.
La explotación de los XXE ciegos extrae datos fuera de banda , donde los datos confidenciales se transmiten desde el servidor de aplicaciones a un sistema que controla el atacante.
Explotar el XXE ciego para recuperar datos a través de mensajes de error , donde el atacante puede desencadenar un mensaje de error de análisis que contiene datos confidenciales.
Extraído del blog de portswigger.
Para poder llevar a cabo este tipo de ataques se debe modificar el fichero XML que se desea subir. Pro ejemplo, en una web de compras hay una aplicación que compruebas las existencias que tiene un artículo de la siguiente forma:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
La aplicación no cuenta con ningún mecanismo que impida realizar un ataque de XXE, por lo tanto, se podría recuperar el fichero /etc/passwd con el siguiente payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
Como se puede observar, el XML que se sube, se ha modificado para realizar una petición del fichero /etc/passwd. Lo que hace concretamente es definir una entidad XXE externa cuyo valor es el fichero /etc/passwd usando la entidad dentro del productId, lo que hace que en la respuesta se incluya el contenido de dicho fichero (passwd).
Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
Vale, vamos a ver esto en la practica para que quede más claro. Como siempre, usamos un lab de la gente de portswigger.
Al abrir el lab, nos encontramos con la tienda que ya hemos visto en otras entradas, así que, visitamos un producto dando en view details. Igual que hicimos en la entrada de SSRF debemos comprobar el stock con el botón que aparece al final de la página del artículo.
Cogemos esa petición y la pasamos al repeater en Burp para poder modificar el XML que aparece.

Bien, es el momento de solicitar el fichero passwd modificando para ello la parte del XML como se muestra a continuación.

Una vez modificado, como se aprecia en la imagen anterior, es el momento de comprobar la respuesta.

Creo que queda bastante claro la potencia de este ataque, a pesar de que en este caso, el lab era el más sencillo.
Recuerdo en una auditoría en la que no tenían restringida la subida de ficheros de forma correcta y me pude echar unas risas probando este tipo de ataques. Como no quiero ir a la carcel, no voy a decir ni empresa ni otro tipo de datos, pero era bastante importante y dio mucho juego :D.
Bueno, como en la vida real no siempre va a ser tan sencillo, veamos otra forma de realizar un ataque XXE a trvés de la subida de ficheros no controlada.
En este caso el lab nos indica que a través de la subida de ficheros debemos mostrar el contenido del fichero hostname (etc/hostname) y nos da una pista diciendo que el tipo de imagen SVG utiliza XML (así es como lo saqué en la auditoría que comentaba unas líneas más arriba).
Lo primero es crear un archivo con el XML que queremos subirle. Recordemos que hay que poder ver el fichero hostname, por lo tanto, en la entidad, debe aparecer "la llamada" a ese fichero, por ejemplo, así:

Guardamos el fichero como XXE.svg (por poner algo) y lo subimos a la web del lab. Antes obviamente, hay que acceder a una de las entradas del blog y en la zona de comentarios, darle al botón de subir fichero.

Una vez subida "la imagen", en la foto del avatar que se crea se puede ver el nombre del host. La forma de hacerlo es dando botón derecho -> ver imagen.

Para terminar, nos piden que pongamos el valor que hemos encontrado. Lo hacemos dando a submit solution, en la parte superior de la página del post en el que hemos hecho el comentario.



Como siempre, os invito a que hagas el resto de labs de XXE que tienen porque ayudan a entender el ataque y a saltarse las restricciones.
Nos vemos en la siguiente.
0 comentarios:
Publicar un comentario