PHP - Deserialization + Autoload Classes
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Kwanza, unapaswa kuangalia ni nini Autoloading Classes.
Tuko katika hali ambapo tumepata PHP deserialization katika webapp bila maktaba inayoweza kuathiriwa na gadgets ndani ya phpggc
. Hata hivyo, katika kontena hiyo hiyo kulikuwa na webapp tofauti ya composer yenye maktaba zinazoweza kuathiriwa. Kwa hivyo, lengo lilikuwa kuchukua loader ya composer ya webapp nyingine na kuitumia kuchukua gadget ambayo itatumia maktaba hiyo kwa gadget kutoka kwa webapp inayoweza kuathiriwa na deserialization.
Hatua:
Umepata deserialization na hakuna gadget katika msimbo wa sasa wa app
Unaweza kutumia spl_autoload_register
kama ifuatavyo ili kuchukua faili yoyote ya ndani yenye kiambishi cha .php
Kwa hiyo unatumia deserialization ambapo jina la darasa litakuwa ndani ya $name
. Huwezi kutumia "/" au "." katika jina la darasa katika kitu kilichosajiliwa, lakini msimbo unabadilisha michoro ("_") kuwa slashes ("/"). Hivyo jina la darasa kama tmp_passwd
litabadilishwa kuwa /tmp/passwd.php
na msimbo utajaribu kulichukua.
Mfano wa gadget utakuwa: O:10:"tmp_passwd":0:{}
Ikiwa una kupakia faili na unaweza kupakia faili yenye .php extension
unaweza kutumia kazi hii moja kwa moja na kupata RCE tayari.
Katika kesi yangu, sikuwa na chochote kama hicho, lakini kulikuwa ndani ya konteina hiyo hiyo ukurasa mwingine wa mtandao wa composer wenye maktaba iliyo hatarini kwa phpggc
gadget.
Ili kupakia maktaba hii nyingine, kwanza unahitaji kupakia loader ya composer ya programu hiyo nyingine (kwa sababu ya ile ya programu ya sasa haitafikia maktaba za nyingine.) Kujua njia ya programu, unaweza kufanikisha hii kwa urahisi sana na: O:28:"www_frontend_vendor_autoload":0:{}
(Katika kesi yangu, loader ya composer ilikuwa katika /www/frontend/vendor/autoload.php
)
Sasa, unaweza kupakia loader ya programu nyingine, hivyo ni wakati wa kuunda phpgcc
payload ya kutumia. Katika kesi yangu, nilitumia Guzzle/FW1
, ambayo iliniruhusu kuandika faili yoyote ndani ya mfumo wa faili.
KUMBUKA: gadget iliyozalishwa haikufanya kazi, ili ifanye kazi nilifanya mabadiliko kwenye payload hiyo chain.php
ya phpggc na kuweka sifa zote za madarasa kutoka binafsi hadi umma. La sivyo, baada ya deserialization ya string, sifa za vitu vilivyoundwa hazikuwa na thamani yoyote.
Sasa tuna njia ya kupakia loader ya programu nyingine na kuwa na phpggc payload inayofanya kazi, lakini tunahitaji kufanya hivi katika OMBI MOJA ili loader ipakuliwe wakati gadget inatumika. Kwa hiyo, nilituma array iliyosawazishwa yenye vitu vyote viwili kama:
Unaweza kuona kwanza loader ikipakiwa na kisha payload
Sasa, tunaweza kuunda na kuandika faili, hata hivyo, mtumiaji hakuweza kuandika katika folda yoyote ndani ya seva ya wavuti. Hivyo, kama unavyoona katika payload, PHP inaita system
na base64 fulani inaundwa katika /tmp/a.php
. Kisha, tunaweza kurudia aina ya kwanza ya payload ambayo tulitumia kama LFI ili kupakia loader ya composer ya programu nyingine ya wavuti kupakia faili iliyoundwa /tmp/a.php
. Ongeza tu kwenye gadget ya deserialization:
Muhtasari wa payload
Pakia autoload ya composer ya webapp tofauti katika kontena moja
Pakia gadget ya phpggc ili kutumia maktaba kutoka webapp nyingine (webapp ya awali iliyoathirika na deserialization haina gadget kwenye maktaba zake)
Gadget itaunda faili yenye payload ya PHP ndani yake katika /tmp/a.php yenye amri za uhalifu (mtumiaji wa webapp hawezi kuandika katika folda yoyote ya webapp yoyote)
Sehemu ya mwisho ya payload yetu itatumia pakiwa faili ya php iliyoundwa ambayo itatekeleza amri
Nilihitaji kuita hii deserialization mara mbili. Katika majaribio yangu, mara ya kwanza faili ya /tmp/a.php
iliumbwa lakini haikupakiwa, na mara ya pili ilipakiwa vizuri.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)