CVE-2025-24799 - SQL-инъекции типа time-based blind
Скрипт эксплуатирует уязвимость SQL-инъекции типа time-based blind (CVE-2025-24799) в приложении GLPI. Он извлекает имена пользователей и пароли из таблицы glpi_users базы данных GLPI через неавторизованную SQL-инъекцию, используя задержку ответа сервера для получения данных
Технические детали
- Пораженные версии: GLPI (до патча для CVE-2025-24799).
- Платформы: Любая, где развернут GLPI (Linux, Windows, macOS, зависит от сервера).
- Тип уязвимости: Неавторизованная time-based blind SQL-инъекция (CWE-89).
- CVSS v3.1: 9.8, вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, так как позволяет удаленное извлечение данных без авторизации.
- Точка входа: XML-обработка в конечной точке (например, /index.php/ajax), уязвимая к внедрению SQL в поле deviceid.
- Метод эксплуатации: Отправка XML с SQL-запросом, использующим IF(condition, SLEEP(3), 0) для посимвольного извлечения данных (name, password) из таблицы glpi_users.
- Ограничения: Медленный процесс (тысячи запросов), требует точной структуры базы данных, уязвим к обнаружению.
Влияние
Скрипт извлекает имена пользователей и пароли из таблицы glpi_users базы данных GLPI через неавторизованную SQL-инъекцию, используя задержку ответа сервера для получения данных
- Использует requests для HTTP-запросов, time для измерения задержек, argparse для аргументов командной строки, colorama для цветного вывода.
- Константы: SLEEP_TIME=3 (задержка SQL), TIMEOUT=6 (таймаут запроса).
- HTTP-заголовки: имитирует Firefox 137.0, отправляет XML.
- print_status/print_error: выводит сообщения успеха (зеленый) или ошибки (красный).
- send_payload: отправляет XML с SQL-инъекцией (IF(condition, SLEEP(3), 0)), проверяет задержку ответа (>3 сек — условие истинно).
- extract_credentials:
- Принимает URL (например, http://site.com/index.php/ajax) через аргумент -u.
- Выводит ASCII-арт с названием уязвимости и автором.
- Уязвимость: предположительно, конечная точка GLPI (например, /index.php/ajax) некорректно обрабатывает XML-ввод, позволяя внедрять SQL-запросы в поле deviceid.
- Техника: time-based blind SQL injection — сервер не возвращает данные напрямую, но задержка ответа (SLEEP(3)) указывает на истинность условия.
<?xml version="1.0"?> <xml> <QUERY>get_params</QUERY> <deviceid>' OR IF({condition},SLEEP(3),0)-- -</deviceid> <content>creds</content> </xml>
deviceid содержит SQL-инъекцию: ' OR IF({condition},SLEEP(3),0)-- -.
- Закрывает строковый литерал (').
- Вставляет условие (IF(condition, SLEEP(3), 0)): если condition истинно, сервер засыпает на 3 секунды.
- Комментарий — нейтрализует остаток запроса.
Проверяет наличие таблицы glpi_users:
EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema=database() AND table_name='glpi_users')
Проверяет наличие колонок name
и password
:
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_name='glpi_users' AND column_name='name')
Для каждого пользователя (до 20). Извлекает имя (до 50 символов) через:
ASCII(SUBSTRING((SELECT name FROM glpi_users LIMIT {i-1},1),{pos},1))={c}
Проверяет ASCII-код символа в позиции pos для значений 32–126. Извлекает пароль (до 100 символов) для Hawkins для ASCII 48–57 (0-9), 65–90 (A-Z), 97–122 (a-z), 36 ($), 46 (.), 47 (/), 92 (), 95 (_). Выводит результат в формате: имя:пароль
.