PHP-FPM se predstavlja kao superiorna alternativa standardnom PHP FastCGI, nudeći funkcije koje su posebno korisne za veb sajtove sa visokim prometom. Radi kroz master proces koji nadgleda skup radnih procesa. Za zahtev PHP skripte, to je veb server koji inicira FastCGI proxy vezu sa PHP-FPM servisom. Ovaj servis ima sposobnost da prima zahteve ili putem mrežnih portova na serveru ili Unix soketa.
I pored posredničke uloge proxy veze, PHP-FPM mora biti operativan na istoj mašini kao veb server. Veza koju koristi, iako je zasnovana na proxy-ju, razlikuje se od konvencionalnih proxy veza. Kada primi zahtev, dostupan radnik iz PHP-FPM ga obrađuje—izvršavajući PHP skriptu i zatim prosleđujući rezultate nazad veb serveru. Nakon što radnik završi obradu zahteva, ponovo postaje dostupan za nadolazeće zahteve.
But what is CGI and FastCGI?
CGI
Normalno, veb stranice, fajlovi i svi dokumenti koji se prenose sa veb servera na pregledač čuvaju se u specifičnom javnom direktorijumu kao što je home/user/public_html. Kada pregledač zatraži određeni sadržaj, server proverava ovaj direktorijum i šalje potrebni fajl pregledaču.
Ako je CGI instaliran na serveru, specifičan cgi-bin direktorijum se takođe dodaje, na primer home/user/public_html/cgi-bin. CGI skripte se čuvaju u ovom direktorijumu. Svaki fajl u direktorijumu se tretira kao izvršni program. Kada se pristupi skripti iz direktorijuma, server šalje zahtev aplikaciji, odgovornoj za ovu skriptu, umesto da šalje sadržaj fajla pregledaču. Nakon što se obrada ulaznih podataka završi, aplikacija šalje izlazne podatke veb serveru koji prosleđuje podatke HTTP klijentu.
Na primer, kada se pristupi CGI skripti http://mysitename.com/cgi-bin/file.pl, server će pokrenuti odgovarajuću Perl aplikaciju putem CGI. Podaci generisani izvršavanjem skripte biće poslati od strane aplikacije veb serveru. Server, s druge strane, će preneti podatke pregledaču. Ako server nije imao CGI, pregledač bi prikazao .pl kod fajla samog. (objašnjenje iz ovde)
FastCGI
FastCGI je novija veb tehnologija, poboljšana CGI verzija jer glavna funkcionalnost ostaje ista.
Potrebno je razviti FastCGI zbog brzog razvoja i složenosti aplikacija, kao i da se reše problemi skalabilnosti CGI tehnologije. Da bi se zadovoljili ti zahtevi, Open Market je uveo FastCGI – visoko performansnu verziju CGI tehnologije sa poboljšanim mogućnostima.
disable_functions bypass
Moguće je pokrenuti PHP kod zloupotrebom FastCGI i izbegavanjem ograničenja disable_functions.
Via Gopherus
Nisam siguran da li ovo radi u modernim verzijama jer sam jednom probao i nije izvršilo ništa. Molim vas, ako imate više informacija o ovome kontaktirajte me putem [PEASS & HackTricks telegram grupe ovde](https://t.me/peass), ili twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Korišćenjem Gopherus možete generisati payload koji ćete poslati FastCGI slušaču i izvršiti proizvoljne komande:
Uploading and accessing this script, exploit će biti poslat FastCGI-ju (onemogućavajući disable_functions) i navedene komande će biti izvršene.
PHP exploit
Nisam siguran da li ovo radi u modernim verzijama jer sam jednom probao i nisam mogao da izvršim ništa. U stvari, uspeo sam da vidim da phpinfo() iz FastCGI izvršenja pokazuje da je disable_functions prazan, ali PHP (na neki način) je i dalje sprečavao da izvršim bilo koju prethodno onemogućenu funkciju. Molim vas, ako imate više informacija o ovome, kontaktirajte me putem [PEASS & HackTricks telegram grupe ovde](https://t.me/peass), ili twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Ovo je php skripta za eksploataciju fastcgi protokola kako bi se zaobišao open_basedir i disable_functions.
Pomoći će vam da zaobiđete stroge disable_functions do RCE učitavanjem maliciozne ekstenzije.
Možete je pronaći ovde: https://github.com/w181496/FuckFastcgi ili blago modifikovanu i poboljšanu verziju ovde: https://github.com/BorelEnzo/FuckFastcgi
Primetićete da je eksploatacija vrlo slična prethodnom kodu, ali umesto pokušaja da se zaobiđe disable_functions koristeći PHP_VALUE, pokušava da učita eksternu PHP modul za izvršavanje koda koristeći parametre extension_dir i extension unutar promenljive PHP_ADMIN_VALUE.
NAPOMENA1: Verovatno ćete morati da rekompajlirate ekstenziju sa istom PHP verzijom koju server koristi (možete to proveriti unutar izlaza phpinfo):
NAPOMENA2: Uspelo mi je da ovo funkcioniše tako što sam ubacio vrednosti extension_dir i extension unutar PHP .ini konfiguracionog fajla (nešto što nećete moći da uradite napadajući server). Ali iz nekog razloga, kada koristim ovu eksploataciju i učitam ekstenziju iz promenljive PHP_ADMIN_VALUE, proces jednostavno umre, tako da ne znam da li je ova tehnika još uvek validna.