ruoyi4.8后台RCE分析
1506847328721267 发表于 浙江 WEB安全 538浏览 · 2025-04-27 05:26

利用需要知道profile目录



环境搭建

https://github.com/yangzongzhuan/RuoYi/releases

导入数据库,修改application-druid中的数据库账号密码

修改application中的文件路径及log存放路径

image.png


image.png


启动成功

image.png








漏洞分析

计划任务

image.png


根据提交数据包锁定后端路由

image.png




image.png


调试看一下具体做了什么

前几个都是在判断是否有包含rmi ldap http关键词,禁止对这些协议进行调用

image.png


还判断了是否有一些黑名单中的类

image.png


进入白名单的判断

image.png


提取出调用的类名,判断其中是否包含白名单字符串

image.png


白名单字符串为com.ruoyi.quartz.task

image.png


注意这里是用正则去匹配的,所以该字符串在任意位置都可以,所以存在可以绕过的可能

image.png


后续就会进入正常的保存计划任务流程

image.png


当启动任务时,会调用方法

image.png


获取需要调用的类名方法名参数值

image.png


在获取方法参数时进行了处理,只允许为字符串/布尔/长整/浮点/整形,无法传递类对象

image.png


接着会实例化该类,反射调用其方法

image.png


该方法为public修饰

image.png




我们想要利用需要达成的是

使用的类不在黑名单中

要存在com.ruoyi.quartz.task字符串

不可以使用rmi ldap http协议



文件上传

而在ruoyi中存在一个文件上传点

image.png


我们可以随便上传一个文件看看

image.png
image.png


那么我们可以上传一个名字包含com.ruoyi.quartz.task字符串的文件

image.png




结合导致RCE

在java中存在一种机制叫做JNI,可以通过加载外部链接库,从而执行其中的构造函数

而com.sun.glass.utils.NativeLibLoader的loadLibrary方法就可以去加载链接库,也是public修饰

image.png


image.png


image.png


注意他会自动在后面添加dylib等后缀,在不同的系统中可能有不同的后缀,并且要注意架构问题







构造并上传链接库

编译后上传该文件

image.png


image.png




我们还需要修改文件名,可以使用RenameUtil类方法去对文件名进行修改

可以修改指定文件名

image.png


启动任务

image.png


image.png


文件名修改成功



尝试rce

image.png


image.png


1 条评论
某人
表情
可输入 255