
PoC для CVE-2025-22652
Плагин WordPress
Название компонента Payment Forms for Paystack
Уязвимая версия <= 4.0.1
Слаг компонента payment-forms-for-paystack
Ссылка на компонент https://wordpress.org/plugins/payment-forms-for-paystack/
Класс уязвимости A3: Injection
Тип уязвимости SQL Injection
Администратор
В плагине Payment Forms for Paystack версии 4.0.1 и ниже присутствует уязвимость SQL-инъекции из-за недостаточной проверки вводимых данных и обработки экранирования для параметра URL order при просмотре списка платежей в платёжных формах. Благодаря этому злоумышленник с привилегиями администратора может извлечь всю информацию из базы данных целевого сайта.
Хотя эта уязвимость не позволяет напрямую запрашивать данные, данные можно извлечь с помощью техники Time-based SQL Injection.
Подготовьте сайт WordPress с установленным плагином Payment Forms for Paystack версии 4.0.1 или ниже.
Поскольку для выполнения запроса необходимо добавить форму Paystack, добавьте форму из меню добавления формы Paystack (wp-admin/post-new.php?post_type=paystack_form).

После добавления формы вы можете проверить шорткод и вставить атрибут ID этого шорткода в параметр URL form в приведённом ниже URL перед его открытием.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)
Например, если [pff-paystack id="13"], перейдите по адресу http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)

В результате, поскольку условие where 1=1 в SQL-инъекции, вставленной в параметр URL order, всегда истинно, вы можете подтвердить, что функция sleep(5) выполняется и ответ приходит через 5 секунд.

С другой стороны, если изменить условие в SQL-инъекции, вставленной в order, на where 1=2, вы можете подтвердить, что ответ приходит немедленно.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
Например, если [pff-paystack id="13"], перейдите по адресу http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)

При запросе URL-адреса, где возникает уязвимость, вызывается функция get_payments_by_id в файле /wp-content/plugins/payment-forms-for-paystack/includes/classes/class-helpers.php.
В этот момент параметр URL order напрямую вставляется в SQL-запрос и выполняется в базе данных без какой-либо проверки вводимых данных или обработки экранирования.

Поэтому при вставке SQL-инъекции , (select sleep(5) from dual where 1=1) в параметр URL order выполняется показанный ниже SQL-запрос. При этом в зависимости от того, истинно или ложно условие в полезной нагрузке, наблюдается разница во времени ответа, и эту разницу можно использовать для извлечения данных из базы данных.
SELECT * FROM %i WHERE post_id = %d AND paid = %s ORDER BY %i , (select sleep(5) from dual where 1=1)
Откройте код PoC в редакторе и введите адрес сайта WordPress и учётные данные администратора.

Необходимый модульrequests
python poc.py
