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

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

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)Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьСтатьи и ИсследованияОбучение и Образование
GitHubxs2024770/cve-2024-57521-ruoyi-sqli

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться

CVE-2024-57521-RuoYi-SQLi

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

Репозиторий
10 ч 5 мин назадЕщё не проверено

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

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

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

root@kitploit:~
@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
    try
    {
        SqlUtil.filterKeyword(sql); // вызов фильтра перед входом в бизнес-логику

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

Скриншот-подтверждение: 03-SqlUtil-filterKeyword

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

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

Код с ключевым дефектом:

root@kitploit:~
// строка 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

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

root@kitploit:~
<update id="createTable">
    ${sql}
</update>

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

Скриншот-подтверждение:

04-GenTableMapper-createTable

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

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

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

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

  1. HTTP-запрос с Payload, содержащим %0b: 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

Скачать инструмент