
PoC of CVE-2025-22710
Плагин WordPress
Имя компонента WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
Уязвимая версия <= 8.50.0
Слаг компонента smart-manager-for-wp-e-commerce
Ссылка на компонент https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
Класс уязвимости A3: Инъекция
Тип уязвимости SQL-инъекция
Администратор
Плагин WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager (далее Smart Manager) позволяет выполнять массовое редактирование и просмотр всех типов записей в WordPress.
В версии плагина Smart Manager 8.50.0 и ниже при использовании функции расширенного поиска для просмотра записей возникает уязвимость SQL-инъекции, поскольку значения фильтрации передаются в запросы к базе данных без экранирования.
Однако, хотя прямые результаты атак SQL-инъекций не видны на экране, возможна слепая SQL-инъекция (Blind SQL Injection) на основе различий в ответах при истинных/ложных условиях.
⚠️ Должна существовать хотя бы одна запись, чтобы увидеть разницу в ответах при истинных/ложных условиях.
/wp-admin/admin.php?page=smart-manager).

' OR 1=1 )) # в текстовое поле. После этого нажмите кнопку поиска вверху.

' OR 1=2 )) # в текстовое поле, записи не будут найдены, так как условие всегда ложно (OR 1=2).

При выполнении функции «Расширенный поиск», описанной в PoC выше, формируется следующий пакет, и значения фильтрации (Заголовок записи, равно, ' OR 1=1 )) #), введённые в расширенном поиске, передаются в данные запроса advanced_search_query.
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

При отправке этого пакета вызывается функция get_data_model в файле /wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php, которая выполняет запросы к базе данных в следующем порядке.
Если существуют данные запроса advanced_search_query, вызывается функция process_search_cond. При этом данные запроса advanced_search_query передаются в значение с ключом search_query в аргументе в виде пары «ключ-значение».
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

Вызванная функция process_search_cond перебирает значение с ключом search_query, инициализирует значение фильтрации «Заголовок записи» (post_title) в переменной $search_col и инициализирует значение фильтрации ' OR 1=1 )) #, содержащее полезную нагрузку SQL-инъекции, в переменной $search_value.
В функции расширенного поиска пользовательский ввод (' OR 1=1 )) #) напрямую включается в запрос к базе данных без экранирования, что приводит к уязвимости SQL-инъекции. Эта уязвимость позволяет злоумышленникам выполнять произвольные SQL-запросы, что может привести к серьёзным рискам для безопасности, таким как утечка или манипулирование конфиденциальной информацией из базы данных.
⚠️ Реализация PoC-кода запрашивает имя базы данных, используя уязвимость SQL-инъекции.
Откройте PoC-код в редакторе и введите адрес сайта WordPress и учётные данные администратора.

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


Переменные $search_col и $search_value передаются в массив $search_params по ключам search_col (=post_title) и search_value (=' OR 1=1 )) #) соответственно. Затем эта переменная $search_params передаётся в качестве значения с ключом search_params функции create_flat_table_search_query.

Далее функция create_flat_table_search_query формирует предложение WHERE SQL-запроса, и на этом этапе search_value (=' OR 1=1 )) #) из ключа search_params, переданного в качестве аргумента, включается в предложение WHERE без какого-либо экранирования.

Затем возвращаемое значение функции create_flat_table_search_query (содержащее полезную нагрузку SQL-инъекции) передаётся в качестве аргумента функции process_flat_table_search_query.

Функция process_flat_table_search_query строит запрос к базе данных, используя полученный аргумент, инициализируя переменные $select, $from и $where. Здесь мы видим, что полезная нагрузка SQL-инъекции передаётся напрямую в переменную $where без какой-либо проверки.

Переменные $select, $from, $where напрямую присваиваются переменной $query_posts_search, и эта переменная в итоге передаётся в качестве аргумента функции, выполняющей запрос к базе данных.
