Activiti/Workflow/bpmn 引擎代码执行问题

请注意,本文编写于 748 天前,最后修改于 748 天前,其中某些信息可能已经过时。

前言

正好实战遇到几次了,发出来记录一下
直接先上参考文献:Activiti BPMN流程引擎使用不当导致的相关RCE问题

代码也直接参考这个就行。

一般我们只需要留意后台中是否有关键字,比如流程图。workflow之类的,或者查看返回包中的json

比如:

1.jpg
1.jpg

再比如:
2.jpg
2.jpg

我们只要确定我们能修改模型和部署模型的权限就成。

或者留意前端请求,长得像这样

3.jpg
3.jpg

落实到前端就是长得像这样:
4.png
4.png

只要这套站是java,并且我们有权限修改模型。

一般模型形式都是长得像这样

{
    "resourceId": "eb39ae1e2dd14910a165323fdcfd807e",
    "properties": {
        "process_id": "test",
        "name": "rwar",
        "documentation": "",
        "process_author": "",
        "process_version": "2",
        "process_namespace": "archive_od",
        "executionlisteners": [],
        .....
}

或者是 在前端直接传输bpmn

4.jpg
4.jpg

这种的我们都能直接打。xml的话可以直接传xml,json的话可以用以下代码,转换为json

byte[] b = "bpmn xml bytes";
InputStream bpmnStream = new ByteArrayInputStream(b);// 获取bpmn2.0规范的xml
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStreamReader in = new InputStreamReader(bpmnStream, "UTF-8");
XMLStreamReader xtr = xif.createXMLStreamReader(in);
// 然后转为bpmnModel
BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr);
// bpmnModel转json
BpmnJsonConverter converter = new BpmnJsonConverter();
com.fasterxml.jackson.databind.node.ObjectNode editorJsonNode = converter.convertToJson(bpmnModel);
System.out.println(editorJsonNode);

然后就可以调用class或者是EL代码直接执行了

后端审计

如果我们拿到的是一套代码如何快速发现利用点呢?

我们只需要三个条件

  • 注入模型可控
  • 能获取到启动条件
  • 启动条件可控

三个却一不可,少一个都跑不起来,落实到代码就是,this.repositoryService.saveModel的参数是否可控,能否获取到processDefinitionId的值,或者不用这个值,取决于代码运行时候要求的内容,还有就是最后的this.runtimeService能否运行我们的模型

对于Activiti BPMN流程引擎使用不当导致的相关RCE问题中给了个例子。

runtimeService.startProcessInstanceByKey("hireProcessWithJpa", vars);

其中的hireProcessWithJpakey就是对应的bpmn的key,但是实际情况可能并不会使用startProcessInstanceByKey。
一个比较经典的情况就是

ProcessInstanceBuilder processInstanceBuilder = this.runtimeService.createProcessInstanceBuilder();
if (processDefinitionId != null) {
processInstanceBuilder.processDefinitionId(processDefinitionId);
}
if (startVariables != null) {
processInstanceBuilder.variables(startVariables);
}
ProcessInstance instance = processInstanceBuilder.start();

这段代码就是根据processDefinitionId来启动流程,所以对于不通的代码我们要落实不同的方法,但是一般只要盯着this.runtimeService看就行

然后下次遇到这些,就能愉快的日下来辣

添加新评论

评论列表