Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2024-57521-RuoYi-SQLi — Статический аудит кода CVE-2024-57521 — аутентифицированной SQL-инъекции в модуле генератора RuoYi-Vue, с анализом от источника к стоку и PoC обхода фильтра через %0b. | Kitploit
Инструменты/GitHubGitHub/xs2024770/cve-2024-57521-ruoyi-sqli
Статический анализ кода (SAST)Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьСтатьи и ИсследованияОбучение и Образование
GitHub

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
xs2024770/cve-2024-57521-ruoyi-sqli

CVE-2024-57521-RuoYi-SQLi

Статический аудит кода CVE-2024-57521 — аутентифицированной SQL-инъекции в модуле генератора RuoYi-Vue, с анализом от источника к стоку и PoC обхода фильтра через %0b.

Репозиторий
481 месяц назадЕщё не проверено

🛡️ CVE-2024-57521 Заметки аудита SQL-инъекции после аутентификации в RuoYi-Vue

CVE

Рис. 1: Схема аудита потока данных уязвимости SQL-инъекции CVE-2024-57521

0. Заявление о проекте

Данный репозиторий предназначен исключительно для целей исследования безопасности и обучения. Не используйте описанные в этом документе методы для несанкционированных атак. Все тесты выполнялись в локальной среде статического аудита кода.


1. Обзор уязвимости

  • Номер CVE: CVE-2024-57521
  • Затронутый компонент: Система управления правами RuoYi-Vue (модуль ruoyi-generator)
  • Затронутые версии: <= v4.7.9
  • Тип уязвимости: SQL-инъекция после аутентификации (булева слепая инъекция / CWE-89)
  • Оценка CVSS: 10.0 (Critical)
  • Метод аудита: Чисто статический аудит кода (анализ исходного кода)

2. Анализ аудита потока данных (Source → Filter → Sink)

2.1 Source (точка входа пользовательского ввода)

  • Расположение файла: ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java

Ключевой код:

@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
    try
    {
        SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器

Анализ: администратор бэкенда может через параметр sql HTTP POST-запроса передать произвольную инструкцию создания таблицы базы данных. Точка входа не имеет достаточных ограничений пользовательского ввода и напрямую передаёт его последующему фильтру.

Скриншот-доказательство: 03-SqlUtil-filterKeyword

2.2 Filter (критический дефект фильтра)

· Расположение файла: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java

Код с критическим дефектом:

// 第16行:黑名单定义,注意关键词带有【尾随空格】
public static String SQL_REGEX = "\u0008|%0A|and |extractvalue|updatexml|sleep|information_schema|exec...";

// 第61-66行:过滤逻辑
String normalizedValue = value.replaceAll("\\p{Z}|\\s", ""); // 先清空了输入里的所有空格
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
    if (StringUtils.indexOfIgnoreCase(normalizedValue, sqlKeyword) > -1)
    {
        throw new UtilException("请求参数包含敏感关键词" + sqlKeyword + ",可能存在安全风险");
    }
}

Анализ уязвимости: фильтр сначала выполняет replaceAll("\p{Z}|\s", ""), удаляя все пробельные символы из входных данных. Однако ключевые слова в чёрном списке SQL_REGEX (такие как "and ", "select ") содержат завершающий пробел. Это приводит к тому, что сопоставление неизбежно терпит неудачу: как только злоумышленник использует %0b (вертикальный табулятор) вместо пробела после ключевого слова, он может идеально обойти проверку чёрного списка.

Доказательства на скриншотах:

02-SqlUtil-SQL_REGEX 01-GenController-createTableSave

2.3 Sink (опасная точка)

· Расположение файла: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml

Ключевой код:

<update id="createTable">
    ${sql}
</update>

Анализ: в MyBatis ${} напрямую конкатенирует строки, а не использует безопасную предварительную компиляцию #{}. В результате вредоносный SQL, уже обошедший фильтр, отправляется в базу данных на выполнение. Это типичная комбинированная уязвимость «фильтрация по чёрному списку + небезопасная конкатенация».

Скриншот-доказательство:

04-GenTableMapper-createTable

3. Логика PoC и подход к эксплуатации

3.1 Метод обхода

· Метод: злоумышленник использует %0b (вертикальная табуляция MySQL, входящая в диапазон совпадения \s) вместо пробелов в SQL-выражении.

3.2 Анализ полной цепочки выполнения

  1. HTTP 传入带有 %0b 的 Payload:CREATE table xxx as SELECT%0b111 FROM sys_job WHERE 1=0 AND%0bIF(<条件>, 1, 1/0);
  2. Payload 进入 filterKeyword 方法,%0b 被 \s 匹配并清空,字符串变为 select111 和 andIF。
  3. 由于黑名单是 "select "(带空格),"select111".indexOf("select ") 返回 -1,成功绕过黑名单拦截。
  4. 危险参数进入 MyBatis,${sql} 将其拼接到数据库。
  5. MySQL 解析时,%0b 被视为合法的空白字符,SQL 成功注入执行。

3.3 Подход к автоматизации слепой инъекции

· Принцип обнаружения: использование IF(<условие>, 1, 1/0) в качестве детектора булевой слепой инъекции. · Условие ложно: срабатывает ошибка деления на ноль, сервер возвращает HTTP 500. · Условие истинно: ошибки нет. · Способ извлечения: с помощью метода бисекции можно побитово угадывать данные базы данных.


4. Итоги и рекомендации по исправлению

4.1 Итог причин уязвимости

Эта уязвимость — типичный обход, вызванный «неполным исправлением». При исправлении предыдущей аналогичной SQL-инъекции разработчик ввёл механизм чёрного списка, но упустил, что чёрный список зависит от пробелов, а предварительная логика удаления пробелов нарушает условия совпадения чёрного списка, что в итоге приводит к новому обходу (CVE-2024-57521).

4.2 Рекомендации по исправлению

· Отказаться от механизма чёрного списка: не полагайтесь на чёрный список, безопасной основой является механизм белого списка. · Использовать предварительную компиляцию: замените ${sql} в MyBatis на предварительную компиляцию #{}. Если необходимо динамически передавать SQL (например, создание таблиц, Order By), следует использовать строгий разбор абстрактного синтаксического дерева (AST) или строгую проверку параметров. · Усовершенствовать фильтр: если необходимо использовать чёрный список, нужно удалить завершающие пробелы у ключевых слов чёрного списка и перед сравнением выполнять единую нормализацию (например, приводить к нижнему регистру, заменять %0b и т. п. на пробелы).


5. Ссылки

· NVD - CVE-2024-57521 · Репозиторий RuoYi-Vue на Gitee

6. Скрипт автоматизированного PoC (на основе error-based инъекции)

  • Расположение файла: poc/poc_boolean.py (примечание: рекомендуется в дальнейшем переименовать файл в poc_error_based.py, чтобы он соответствовал фактической логике)
  • Принцип реализации: использование функции extractvalue() для вызова ошибки XPath, извлечение данных через регулярное совпадение XPATH syntax error: '~...~'. В Payload используется /**/ вместо пробелов для обхода фильтрации по чёрному списку.
  • Ключевой Payload:

CREATE//table//{随机表名}//as//SELECT/**/extractvalue(1,concat(0x7e,({查询语句}),0x7e))

Примечание к тестированию: в локально развёрнутом тестовом стенде RuoYi успешно подтверждена возможность обхода WAF с помощью %0b, а также работоспособность error-based инъекции через extractvalue; скрипт стабильно извлекает версию MySQL (5.7.26), имя текущей базы данных (ry) и пользователя подключения к базе данных (root@localhost).

屏幕截图 2026-09-29 172250
Скачать инструмент