tags: XML XML-XXE_Injection Costruzione_Payload_XML


È tutto un gioco di Variabili.

Immagina l’XXE (XML External Entity) come se fosse un piccolo programma. Ecco la spiegazione punto per punto.

  1. I nomi sono casuali? Sì, assolutamente. &file;, &win;, &xxe;, &pippo;… sono nomi che scegli TU.

Quando scrivi:

<!ENTITY miofile SYSTEM "file:///...">

Stai dicendo al parser XML: “D’ora in poi, crea una variabile chiamata miofile e riempila con il contenuto di quel file.”

Il server non si aspetta un nome specifico. Il server si aspetta solo che il nome che usi nella definizione (in alto) sia identico a quello che usi nel richiamo (in basso).

  1. Perché la & e il ;?

Questa è pura sintassi XML. In XML, per dire al parser “Ehi, questa non è una parola normale, ma è una variabile che devi sostituire”, si usano questi delimitatori:

& (Ampersand): Inizio della variabile.

; (Punto e virgola): Fine della variabile.

Quindi &miofile; dice al parser: “Sostituisci questa stringa con il valore che ho definito sopra”.

  1. Dove vanno inseriti e perché? Vanno inseriti dentro i tag dei dati (come <item>, <address>, <quantity>) per un motivo molto pratico: l’Output.

Immagina che il codice PHP del server funzioni così (pseudocodice):

$xml = simplexml_load_string($input_utente);
echo "Hai ordinato: " . $xml->item;
echo "Spediremo a: " . $xml->address;
// La quantità viene salvata nel database ma NON stampata a video

Se tu inserisci &miofile; dentro <quantity>, il parser leggerà il file, lo metterà nella variabile quantità, ma poi il server non te lo mostrerà. (Questo si chiama Blind XXE).

Se invece lo inserisci dentro <item> o <address>, il server prenderà il contenuto del file e te lo sparerà a video nella risposta HTTP.

Esempio Pratico (La prova del nove) Per dimostrarti che i nomi sono arbitrari, ecco lo stesso identico payload per leggere job.bat ma con nomi inventati. Funzionerà esattamente come l’altro:

<?xml version="1.0"?>
<!DOCTYPE root [
  <!ENTITY supersegreto SYSTEM "php://filter/read=convert.base64-encode/resource=C:/Log-Management/job.bat">
]>
<order>
  <quantity>1</quantity>
  <item>&supersegreto;</item>
  <address>Via Roma</address>
</order>

In sintesi:

Tu definisci il nome (<!ENTITY nome ...>).

Tu usi quel nome (&nome;).

Lo metti in un campo (<tag>…) che sai per certo che il sito ti mostrerà nella risposta.