
PoC of CVE-2025-30921
Плагин WordPress
Component name Newsletters
Vulnerable version <= 4.9.9.7
Component slug newsletters-lite
Component link https://wordpress.org/plugins/newsletters-lite/
Vulnerability class A3: Injection
Vulnerability type SQL Injection
Администратор
При просмотре сводной диаграммы статистики в панели управления плагина Newsletters (/wp-admin/admin.php?page=newsletters) версии 4.9.9.7 или ниже возникает уязвимость SQL-инъекции из-за недостаточной проверки ввода и обработки экранирования параметров URL.
С помощью этой уязвимости злоумышленник с правами администратора может извлечь информацию из базы данных целевого сайта.
Подготовьте сайт WordPress с установленным плагином Newsletters версии 4.9.9.7 или ниже.
Перейдите в меню панели управления плагина Newsletters (/wp-admin/admin.php?page=newsletters).

Используя инструменты разработчика браузера, найдите action=wpmlwelcomestats&security= на вкладке 'Elements' и проверьте значение security. Например, если результат поиска выглядит как показано ниже, запишите 22b1ac0de6.
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

Введите записанное значение security в раздел <SECURITY VALUE> пути URL ниже и отправьте запрос на этот URL.
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=<SECURITY VALUE>&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
При запросе URL, в котором возникает уязвимость SQL-инъекции в приведённом выше PoC, вызывается функция ajax_welcomestats в файле /wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php.
В этот момент параметр запроса history_id напрямую используется как условие в строке SQL-запроса и инициализируется как переменная $history_condition. Эта переменная затем передаётся в запрос к базе данных без какой-либо обработки экранирования.

Таким образом, поскольку для значений, введённых в параметр URL history_id, отсутствует проверка или экранирование, возникает уязвимость SQL-инъекции. (Обратите внимание, что параметры URL from и to также уязвимы для атак SQL-инъекции из-за недостаточной проверки ввода и обработки экранирования.)
Среди параметров URL
history_idсодержит полезную нагрузку SQL-инъекции, которая позволяет запросить имя базы данных (DATABASE()) и версию (@@VERSION). Например, когда значениеsecurityравно22b1ac0de6, перейдите по следующему URL.
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=22b1ac0de6&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
При проверке ответа на запрос URL можно подтвердить, что имя базы данных и информация о версии раскрыты из-за уязвимости SQL-инъекции через параметр history_id.
