
CVE-2026-9848 is an Unauthenticated SQL Injection (SQLi) vulnerability affecting the WP Ticket (Customer Support Ticket System & Helpdesk) plugin for WordPress up to and including version 6.0.4.
CVE-2026-9848 — это неаутентифицированная SQL-инъекция (SQLi), затрагивающая плагин WP Ticket (Customer Support Ticket System & Helpdesk) для WordPress до версии 6.0.4 включительно. Уязвимость возникает из-за того, что плагин берёт параметр поиска WordPress s и напрямую конкатенирует его в SQL LIKE-предложение внутри подзапроса UNION, не используя $wpdb->prepare() или надлежащее экранирование. В результате удалённый атакующий может манипулировать запросами к базе данных и извлекать конфиденциальную информацию без аутентификации.
| Свойство | Значение |
|---|
| Продукт | WP Ticket (Customer Support Ticket System & Helpdesk) |
| Затронутые версии | ≤ 6.0.4 |
| Исправленная версия | 6.0.5 |
| Затронутый компонент | Поиск на фронтенде (параметр s) |
Плагин перехватывает фильтр WordPress posts_request через wp_ticket_com_posts_request(). Во время неаутентифицированного поиска на фронтенде он в конечном итоге вызывает emd_author_search_results(), которая считывает параметр поиска:
$query->query_vars['s']
На этом этапе WordPress уже удалил магические кавычки с помощью wp_unslash(). Вместо безопасной параметризации SQL-запроса плагин конкатенирует необработанный пользовательский ввод в SQL LIKE-предложение внутри подзапроса UNION.
Концептуально:
User searches website
│
▼
Search parameter "s" received
│
▼
Plugin concatenates value into SQL query
│
▼
No $wpdb->prepare()
│
▼
Database executes modified query
Уязвимость существует, поскольку ненадёжный ввод включается в SQL с помощью конкатенации строк, а не параметризованных запросов.
Суть уязвимости — в том, как плагин строит свой основной SQL-запрос:
sql
SELECT * FROM wp_posts
WHERE post_title LIKE '%[attacker's input]%'
UNION [attacker's injected SQL]
Attacker
│
▼
Submits a crafted search request
│
▼
WordPress passes the "s" parameter
│
▼
WP Ticket builds SQL query using concatenation
│
▼
Database executes injected SQL
│
▼
Sensitive database information may be disclosed
Обычный посетитель выполняет поиск по сайту:
GET /?s=printer
Плагин включает значение параметра s в SQL-запрос, который ищет информацию, связанную с тикетами.
Поскольку плагин конкатенирует значение поиска непосредственно в SQL-выражение вместо использования параметризованных запросов, специально сформированный поисковый запрос может изменить предполагаемую SQL-логику. Неаутентифицированный атакующий может использовать это поведение для получения конфиденциальной информации из базы данных WordPress, такой как имена пользователей или другие сохранённые данные. Точный результат зависит от конфигурации приложения и прав доступа к базе данных.
Теперь атакующий может манипулировать параметром s, чтобы внедрить собственный SQL. Например, он может ввести:
' UNION SELECT user_login, user_pass FROM wp_users -- -
В результате финальный запрос будет выглядеть так:
SELECT * FROM wp_posts WHERE post_title LIKE '%' UNION SELECT user_login, user_pass FROM wp_users -- -%'
Успешная эксплуатация может позволить атакующему:
| Метрика | Балл |
|---|---|
| CVSS v3.1 (Wordfence CNA) | 7.5 (высокий) |
NVD ещё не опубликовал собственную оценку CVSS.
Примечание: вендор не опубликовал полную уязвимую реализацию. Ниже проиллюстрирован уязвимый шаблон кода.
$search = $query->query_vars['s'];
$sql = "
SELECT *
FROM tickets
WHERE title LIKE '%" . $search . "%'
";
$wpdb->get_results($sql);
SQL-выражение формируется путём конкатенации пользовательского ввода непосредственно в строку запроса. Поскольку ввод не параметризуется и не экранируется, он может изменить структуру SQL-выражения.
$search = $query->query_vars['s'];
$sql = $wpdb->prepare(
"SELECT *
FROM tickets
WHERE title LIKE %s",
'%' . $search . '%'
);
$wpdb->get_results($sql);
Использование $wpdb->prepare() отделяет SQL-синтаксис от пользовательского ввода. База данных обрабатывает значение поиска как данные, а не как исполняемый SQL, что не позволяет атакующим изменять структуру запроса. Официальное исправление в WP Ticket 6.0.5 заменяет уязвимую конструкцию запроса на правильно параметризованную реализацию.