帆软channel接口反序列化漏洞分析
影响版本
FineReport10.0、FineReport11.0、FineBI5.1 系列均受影响
环境搭建
FineBI5.1环境 链接: https://pan.baidu.com/s/1AOPKgy-Rt3fGjBqlyG2qzA?pwd=4th9 提取码: 4th9(环境来源于网络不保证安全性)
代码分析
官网发布漏洞路径:webroot/decision/remote/design/channel
漏洞jar包:fine-decision-report-10.0.jar
代码位置:RemoteDesignResource.class
首先将POST传入进来的数据传递到WorkContext.handleMessage()
方法,跟进查看
继续跟进messageListener.handleMessage(var0)
,发现这里将之前POST获取的值传入到deserializeInvocation
方法中
跟进deserializeInvocation
方法,这里SerializerHelper.deserialize()
会传入两个参数
第一个参数是之前传入的POST数据
第二个参数是通过用InvocationSerializer
来封装了GZipSerializerWrapper
类。
继续跟进deserialize()
方法,这里会调用之前用InvocationSerializer
来封装了GZipSerializerWrapper
类的deserialize
方法进行反序列化数据。
这里先通过GZIPInputStream()
方法进行数据进行解压一次,然后在调用this.serializer
的deserialize
方法,而这里this.serializer
就是之前InvocationSerializer
,具体可以看下面两张图
继续跟进InvocationSerializer
类的deserialize
方法,这里就很明了直接调用readObject
反序列化。
FineReport 和 FineBi区别
测试发现FineReport
的InvocationSerializer
的deserialize
多了一次CustomObjectInputStream
封装,而FineBi
则直接调用readObject
进行反序列化。
利用链
目前有了入口点需要找利用链,晃眼一看没有常见的CC、CB的依赖库,后面分析发现其实都封装在fine-bi-engine-third-5.1.jar
包里面。
漏洞利用
需注意:commons-beanutils
版本与服务器版本相同(之前没注意导致一直反序列化失败)。
这里我就采用比较简单的方法,把目标源码的jar包来作为依赖重新写一遍CB链。