
В бэкенде Ruoyi v4.8.3 существует уязвимость SQL-инъекции.
filterKeyword Обход SQL-инъекцииТребуется авторизация / Только для санкционированного тестирования
Этот репозиторий предназначен только для исследований в области безопасности и санкционированного тестирования. Не используйте его против систем без явного разрешения.
Этот репозиторий предназначен только для исследований в области безопасности и тестирования с явным разрешением. Не используйте его против несанкционированных систем.
Конечная точка /tool/gen/createTable модуля генерации кода RuoYi v4.8.3 принимает SQL для создания таблиц от аутентифицированных пользователей бэкенда. Вызов SqlUtil.filterKeyword() выполняет фильтрацию по черному списку ключевых слов. Однако реализация сначала удаляет все пробельные символы из ввода, а затем сопоставляет с ключевыми словами, содержащими завершающие пробелы (например, select , insert , drop ), в результате чего соответствующие правила не срабатывают.
С помощью оператора CREATE TABLE ... AS SELECT ... (CTAS) можно обойти проверку типа Druid MySqlCreateTableStatement, одновременно выполняя SELECT. Злоумышленник, имеющий действительную сессию бэкенда, может использовать это для слепой SQL-инъекции на основе булевых значений, извлечения конфиденциальных данных и создания таблиц.
JSESSIONID.Скрипт проверки использует следующую логику для извлечения хеша пароля и соли пользователя admin из таблицы sys_user:
login_name, password и salt.SUBSTRING() в WHERE./tool/gen/list.requests, urllib3Установка зависимостей:
python -m pip install requests urllib3
Откройте exp.py и замените следующие две строки в конфигурационной секции вверху файла:
TARGET = "http://127.0.0.1:8080"
COOKIE = "JSESSIONID=your_session_id"
Где:
TARGET: замените на URL тестируемого RuoYi, например http://127.0.0.1:8080.COOKIE: замените на действительный JSESSIONID сессии бэкенда после входа.После замены выполните:
python exp.py
Скрипт создает в целевой базе данных промежуточную таблицу и множество тестовых таблиц для булевых проверок. Используйте его только в изолированной или явно авторизованной среде; после тестирования попросите администратора базы данных удалить созданные таблицы.
exp.png — скриншот успешной проверки в локальной авторизованной среде:

filterKeyword(), но не рассматривайте это как единственную меру защиты.Конечная точка /tool/gen/createTable в модуле генерации кода RuoYi v4.8.3 принимает SQL для создания таблиц от аутентифицированных пользователей бэкенда. Вызов SqlUtil.filterKeyword() предназначен для блокировки опасных ключевых слов SQL. Однако реализация удаляет все пробельные символы из ввода перед проверкой по черному списку, который содержит записи с завершающими пробелами, например select , insert и drop . В результате эти записи не могут совпасть с нормализованным вводом.
Оператор CREATE TABLE ... AS SELECT ... (CTAS) может пройти проверку типа Druid MySqlCreateTableStatement, все еще выполняя SELECT. Злоумышленник с действительной сессией бэкенда может использовать это поведение для слепой SQL-инъекции на основе булевых значений, извлечения конфиденциальных данных и создания таблиц.
JSESSIONID бэкенда.Скрипт восстанавливает хеш пароля и соль admin из таблицы sys_user, используя следующий оракул:
login_name, password и salt.SUBSTRING()./tool/gen/list.requests, urllib3Установка зависимостей:
python -m pip install requests urllib3
Откройте exp.py и замените следующие две строки в конфигурационной секции вверху файла:
TARGET = "http://127.0.0.1:8080"
COOKIE = "JSESSIONID=your_session_id"
Где:
TARGET — базовый URL RuoYi для тестирования, например http://127.0.0.1:8080.COOKIE — действительная аутентифицированная JSESSIONID сессии бэкенда.После замены URL и сессии выполните:
python exp.py
Скрипт создает в целевой базе данных промежуточную таблицу и множество тестовых таблиц для булевых проверок. Используйте его только в изолированной или явно авторизованной среде; после тестирования попросите администратора базы данных удалить созданные таблицы.
exp.png показывает успешную проверку в авторизованной локальной среде:

filterKeyword(), но не рассматривайте это как единственную меру защиты.exp.py - скрипт проверки / verification scriptexp.png - скриншот успешной проверки / successful verification screenshotREADME.md - двуязычная документация по уязвимости / bilingual vulnerability documentation