帆软channel接口反序列化漏洞分析

影响版本

FineReport10.0、FineReport11.0、FineBI5.1 系列均受影响

image-20230310145403530

环境搭建

FineBI5.1环境 链接: https://pan.baidu.com/s/1AOPKgy-Rt3fGjBqlyG2qzA?pwd=4th9 提取码: 4th9(环境来源于网络不保证安全性)

image-20230310145513752

代码分析

官网发布漏洞路径:webroot/decision/remote/design/channel

漏洞jar包:fine-decision-report-10.0.jar

代码位置:RemoteDesignResource.class

首先将POST传入进来的数据传递到WorkContext.handleMessage()方法,跟进查看

image-20230310150143645

image-20230310151127122

继续跟进messageListener.handleMessage(var0),发现这里将之前POST获取的值传入到deserializeInvocation方法中

跟进deserializeInvocation方法,这里SerializerHelper.deserialize()会传入两个参数

image-20230310151504750

第一个参数是之前传入的POST数据

第二个参数是通过用InvocationSerializer来封装了GZipSerializerWrapper类。

image-20230310151652108

继续跟进deserialize()方法,这里会调用之前用InvocationSerializer来封装了GZipSerializerWrapper类的deserialize方法进行反序列化数据。

image-20230310152501275

image-20230310152444983

这里先通过GZIPInputStream()方法进行数据进行解压一次,然后在调用this.serializerdeserialize方法,而这里this.serializer就是之前InvocationSerializer,具体可以看下面两张图

image-20230310153656438

image-20230310155205901

image-20230310155233209

继续跟进InvocationSerializer类的deserialize方法,这里就很明了直接调用readObject反序列化。

image-20230310153213278

FineReport 和 FineBi区别

测试发现FineReportInvocationSerializerdeserialize多了一次CustomObjectInputStream封装,而FineBi则直接调用readObject进行反序列化。

image-20230310164316709

利用链

目前有了入口点需要找利用链,晃眼一看没有常见的CC、CB的依赖库,后面分析发现其实都封装在fine-bi-engine-third-5.1.jar包里面。

image-20230310165816810

image-20230310170158154

漏洞利用

需注意:commons-beanutils版本与服务器版本相同(之前没注意导致一直反序列化失败)。

这里我就采用比较简单的方法,把目标源码的jar包来作为依赖重新写一遍CB链。

image-20230312192731947

image-20230312193015594

image-20230312192756838