August 14

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:
    • Проверяет наличие таблицы glpi_users и колонок name, password.
    • Извлекает до 20 пар логин-пароль посимвольно (ASCII 32–126 для имен, буквенно-цифровые + $./\_ для паролей).
    • Выводит результат в формате имя:пароль.

Запуск:

  • Принимает URL (например, http://site.com/index.php/ajax) через аргумент -u.
  • Выводит ASCII-арт с названием уязвимости и автором.

Механизм SQL-инъекции:

  • Уязвимость: предположительно, конечная точка GLPI (например, /index.php/ajax) некорректно обрабатывает XML-ввод, позволяя внедрять SQL-запросы в поле deviceid.
  • Техника: time-based blind SQL injection — сервер не возвращает данные напрямую, но задержка ответа (SLEEP(3)) указывает на истинность условия.

Формат полезной нагрузки:

  • XML-пayload:
<?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 (_). Выводит результат в формате: имя:пароль.

Download | Github