PHP - Deserialization + Autoload Classes
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:{}
Ikiwa una upakiaji wa faili na unaweza kupakia faili na kifungu cha .php
, unaweza kutumia kazi hii moja kwa moja na kupata RCE tayari.
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
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:
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.
Last updated