
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 ist eine nicht authentifizierte SQL-Injection-Schwachstelle (SQLi), die das Plugin WP Ticket (Customer Support Ticket System & Helpdesk) für WordPress bis einschließlich Version 6.0.4 betrifft. Der Fehler entsteht, weil das Plugin den WordPress-Suchparameter s direkt in eine SQL-LIKE-Klausel innerhalb einer UNION-Teilabfrage verkettet, ohne $wpdb->prepare() oder eine ordnungsgemäße Escaping-Behandlung zu verwenden. Dadurch kann ein entfernter Angreifer Datenbankabfragen manipulieren und vertrauliche Informationen ohne Authentifizierung extrahieren.
| Eigenschaft | Wert |
|---|---|
| Produkt | WP Ticket (Customer Support Ticket System & Helpdesk) |
| Betroffene Versionen | ≤ 6.0.4 |
| Behobene Version | 6.0.5 |
| Betroffene Komponente | Frontend-Suche (Parameter s) |
Das Plugin bindet den WordPress-Filter posts_request über wp_ticket_com_posts_request() ein. Während einer nicht authentifizierten Frontend-Suche ruft es schließlich emd_author_search_results() auf, das den Suchparameter ausliest:
$query->query_vars['s']
An diesem Punkt hat WordPress die Magic Quotes bereits mit wp_unslash() entfernt. Anstatt die SQL-Anweisung sicher zu parametrisieren, verkettet das Plugin die rohe Benutzereingabe in einer SQL-LIKE-Klausel innerhalb einer UNION-Teilabfrage.
Konzeptionell:
User searches website
│
▼
Search parameter "s" received
│
▼
Plugin concatenates value into SQL query
│
▼
No $wpdb->prepare()
│
▼
Database executes modified query
Die Schwachstelle besteht, weil nicht vertrauenswürdige Eingaben mithilfe von String-Verkettung in SQL eingebunden werden, anstatt parametrisierte Abfragen zu verwenden.
Der Kern der Schwachstelle liegt darin, wie das Plugin seine Haupt-SQL-Abfrage aufbaut:
sql
SELECT * FROM wp_posts
WHERE post_title LIKE '%[attacker's input]%'
UNION [attacker's injected SQL]
Hier ist eine Schritt-für-Schritt-Erklärung der erstellten Abfrage:
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
Ein normaler Besucher führt eine Website-Suche durch:
GET /?s=printer
Das Plugin bindet den Wert des Parameters s in eine SQL-Abfrage ein, die ticketbezogene Informationen durchsucht.
Da das Plugin den Suchwert direkt in die SQL-Anweisung verkettet, anstatt parametrisierte Abfragen zu verwenden, kann eine speziell gestaltete Suchanfrage die beabsichtigte SQL-Logik verändern. Ein nicht authentifizierter Angreifer kann dieses Verhalten ausnutzen, um vertrauliche Informationen aus der WordPress-Datenbank abzurufen, beispielsweise Benutzernamen oder andere gespeicherte Daten. Das genaue Ergebnis hängt von der Konfiguration der Anwendung und den Datenbankberechtigungen ab.
Nun kann ein Angreifer den Parameter s manipulieren, um eigenen SQL-Code einzuschleusen. Beispielsweise könnte er Folgendes eingeben:
' UNION SELECT user_login, user_pass FROM wp_users -- -
Dadurch würde die endgültige Abfrage wie folgt aussehen:
SELECT * FROM wp_posts WHERE post_title LIKE '%' UNION SELECT user_login, user_pass FROM wp_users -- -%'
Eine erfolgreiche Ausnutzung kann einem Angreifer Folgendes ermöglichen:
Die Schwachstelle betrifft in erster Linie die Vertraulichkeit.
| Metrik | Bewertung |
|---|---|
| CVSS v3.1 (Wordfence CNA) | 7.5 (Hoch) |
Das NVD hat seine eigene CVSS-Bewertung noch nicht veröffentlicht.
Hinweis: Der Hersteller hat die vollständige verwundbare Implementierung nicht veröffentlicht. Das Folgende veranschaulicht das verwundbare Codierungsmuster.
$search = $query->query_vars['s'];
$sql = "
SELECT *
FROM tickets
WHERE title LIKE '%" . $search . "%'
";
$wpdb->get_results($sql);
Die SQL-Anweisung wird erstellt, indem eine vom Benutzer kontrollierte Eingabe direkt in den Abfragestring verkettet wird. Da die Eingabe nicht parametrisiert oder escaped wird, kann sie die Struktur der SQL-Anweisung verändern.
$search = $query->query_vars['s'];
$sql = $wpdb->prepare(
"SELECT *
FROM tickets
WHERE title LIKE %s",
'%' . $search . '%'
);
$wpdb->get_results($sql);
Die Verwendung von $wpdb->prepare() trennt die SQL-Syntax von der Benutzereingabe. Die Datenbank behandelt den Suchwert als Daten und nicht als ausführbares SQL, wodurch Angreifer daran gehindert werden, die Abfragestruktur zu verändern. Der offizielle Fix in WP Ticket 6.0.5 ersetzt die verwundbare Abfragekonstruktion durch eine ordnungsgemäß parametrisierte Implementierung.