PHP - Deserialization + Autoload Classes
Last updated
Last updated
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Prvo, trebate proveriti šta su Autoloading Klase.
Nalazimo se u situaciji gde smo pronašli PHP deserializaciju u web aplikaciji bez ikakvih biblioteka ranjivih na gadgete unutar phpggc
. Međutim, u istom kontejneru postojala je druga composer web aplikacija sa ranjivim bibliotekama. Stoga, cilj je bio učitati composer loader druge web aplikacije i iskoristiti ga da učita gadget koji će iskoristiti tu biblioteku sa gadgetom iz web aplikacije ranjive na deserializaciju.
Koraci:
Pronašli ste deserializaciju i nema gadgeta u trenutnom kodu aplikacije
Možete iskoristiti funkciju spl_autoload_register
kao što je sledeća da učitate bilo koji lokalni fajl sa .php
ekstenzijom
Za to koristite deserializaciju gde će ime klase biti unutar $name
. Ne možete koristiti "/" ili "." u imenu klase u serijalizovanom objektu, ali kod menja donje crte ("_") u kose crte ("/"). Tako će ime klase kao što je tmp_passwd
biti transformisano u /tmp/passwd.php
i kod će pokušati da ga učita.
Primer gadgeta bi bio: O:10:"tmp_passwd":0:{}
Ako imate upload fajlova i možete da upload-ujete fajl sa .php
ekstenzijom, mogli biste da zloupotrebite ovu funkcionalnost direktno i dobijete već RCE.
U mom slučaju, nisam imao ništa slično, ali je unutar iste kontejnere bila još jedna composer web stranica sa bibliotekom koja je ranjiva na phpggc
gadget.
Da biste učitali ovu drugu biblioteku, prvo morate da učitate composer loader te druge web aplikacije (jer loader trenutne aplikacije neće imati pristup bibliotekama druge.) Poznavajući putanju aplikacije, to možete lako postići sa: O:28:"www_frontend_vendor_autoload":0:{}
(U mom slučaju, composer loader je bio u /www/frontend/vendor/autoload.php
)
Sada možete učitati loader druge aplikacije, tako da je vreme da generišete phpgcc
payload koji ćete koristiti. U mom slučaju, koristio sam Guzzle/FW1
, što mi je omogućilo da pišem bilo koji fajl unutar fajl sistema.
NAPOMENA: Generisani gadget nije radio, da bi radio, izmenio sam taj payload chain.php
od phpggc i postavio sve atribute klasa sa privatnih na javne. Ako ne, nakon deserializacije stringa, atributi kreiranih objekata nisu imali nikakve vrednosti.
Sada imamo način da učitamo loader druge aplikacije i imamo phpggc payload koji radi, ali moramo to uraditi u ISTOM ZAHTEVU da bi loader bio učitan kada se gadget koristi. Za to, poslao sam serijalizovani niz sa oba objekta kao:
Možete videti prvo kako se loader učitava, a zatim payload
Sada možemo da kreiramo i pišemo datoteku, međutim, korisnik nije mogao da piše u bilo koju fasciklu 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 ponovo iskoristiti prvi tip payload-a koji smo koristili kao LFI da učitamo composer loader druge web aplikacije da učitamo generisanu /tmp/a.php
datoteku. Samo ga dodajte u gadget za deserializaciju:
Sažetak napada
Učitaj composer autoload druge web aplikacije u istom kontejneru
Učitaj phpggc gadget da bi iskoristio biblioteku iz druge web aplikacije (prva web aplikacija ranjiva na deserializaciju nije imala nijedan gadget u svojim bibliotekama)
Gadget će napraviti datoteku sa PHP payload-om u /tmp/a.php sa malicioznim komandama (korisnik web aplikacije ne može da piše u bilo koju fasciklu bilo koje web aplikacije)
Poslednji deo našeg payload-a će koristiti učitavanje generisane php datoteke koja će izvršiti komande
Trebao sam da pozovem ovu deserializaciju dva puta. U mom testiranju, prvi put je datoteka /tmp/a.php
kreirana, ali nije učitana, a drugi put je ispravno učitana.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)