L'XML External Entity (XXE) si riferisce ad un tipo specifico di attacco SSRF (Server-Side Request Forgery)

in quanto l'attaccante è in grado di provocare Denial of Service (DoS) e di accedere a file e servizi locali o remoti, abusando di alcune funzionalità molto accessibili raramente utilizzate nei parser XML.

L’XML è un formato di dati molto utilizzato in tutti i servizi web (XML-RPC, SOAP, REST ...) i documenti (XML, HTML, DOCX) e i file di immagine (SVG, dati EXIF ...). Naturalmente, laddove c'è un XML, c'è un parser XML - ricordatevelo, ci ritorneremo a breve.

Di seguito è riportato un semplice esempio di un'applicazione web che accetta l'input XML, lo analizza e trasmette il risultato:

L’XML, tuttavia, può fare molto di più che semplicemente dichiarare elementi, attributi e testo. I documenti XML possono specificare un insieme di dichiarazioni di markup che definiscono un tipo di documento, affinché un parser XML convalidi il documento XML correttamente prima di essere elaborato. Ci sono due modi per farlo - sia tramite una definizione di schema XML (XSD) o una definizione di tipo di dati (DTD).

Data Type Definitions (DTDs), saranno l’argomento su cui ci concentreremo, in quanto è qui che si verificano le vulnerabilità XML External Entity. Le DTD possono essere considerate abbastanza consolidate, infatti derivano da SGML (antenato dell’XML).

Di seguito è riportato un semplice esempio di una Data Type Definition (DTD) denominata foo con un elemento denominato bar, che è un alias della parola "World". Pertanto, ogni volta che viene utilizzato &bar; il parser XML lo sostituirà con la parola "World".

Anche se tutto questo inizialmente sembra inoffensivo, le entità XML possono essere utilizzate da un aggressore per causare un attacco DoS (Denial of Service) da parte delle entità incorporanti, all'interno di entità all'interno di altre entità. Questo attacco è comunemente indicato come " Billion Laughs attack". Alcuni parser XML limitano automaticamente la quantità di memoria che possono utilizzare.

Le entità XML tuttavia possono essere utilizzate per molto di più che un Denial of Service poiché non devono essere necessariamente definite nel documento XML. Infatti, le entità XML possono provenire da qualsiasi parte - comprese le fonti esterne, da qui il nome XML External Entity (XXE). E’ questo il momento in cui un XXE diventa un attacco di tipo Server-side Request Forgery (SSRF).

Un attaccante può effettuare la richiesta come nell’esempio sottostante e se il parser XML è configurato per elaborare entità esterne (per impostazione predefinita, molti parser XML popolari sono configurati per farlo), restituirà il contenuto di un file nel sistema.

Chiaramente un attaccante non è limitato ai soli file di sistema e può facilmente rubare il codice sorgente conoscendo la posizione e la struttura dell'applicazione web. Vale la pena ricordare che con alcuni parser XML è possibile ottenere elenchi di directory oltre al contenuto di un file.

L’XML External Entity può essere portata ad un livello ancora più alto facendo richieste HTTP regolari ai file della rete locale (cioè accessibili solo da dietro il firewall).