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
添加一下两个变量,选择表达式,
script:var System = java.lang.Runtime.getRuntime().exec("calc");
language:js
方法二 (使用表达式或者代理表达式):
${''.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 下载
-
-
hyy30291920
2025-03-24 01:32 0 回复
哥 这种框架里面要怎么分析啊 这个框架里面的触发点 org.flowable.engine.impl.bpmn.listener.ListenerNotificationHelper 这个类最前面是thread起的 方便加个v吗 老哥