帆软 FineReport/FineBI channel反序列化漏洞分析

事件背景

热点漏洞

漏洞说明

1. 漏洞原理:FineReport/FineBI channel接口能接受序列化数据并对其进行反序列化。配合帆软内置CB链会导致任意代码执行。

2. 组件描述:FineReport是一款企业级报表设计和数据分析工具,它提供了丰富多样的组件,用于创建和展示数据报表。

FineBI 是一款企业级的商业智能 (BI) 平台,提供了丰富的功能和组件,用于数据分析、报表生成和数据可视化等任务

3. 影响版本: 2022-08-12 之前的 FineReport10.0/11.0、FineBI5.1 系列均受影响

漏洞复现

环境搭建:https://fine-build.oss-cn-shanghai.aliyuncs.com/finebi/5.1.5/stable_test/backup/2021-02-26/exe/spider/linux_unix_FineBI5_1-CN.sh

安装在虚拟机环境中,需要给虚拟机至少6G内存才能安装终端输入./linux_unix_FineBI5_1-CN.sh即可安装,安装后,直接运行程序,在环境的bin目录中输入命令

tail -F output.log

可以看到环境的URL,访问并登录后如下

向idea的jar库导入FineBI中web中的库,最后跑下脚本即可
EXP已隐藏,仅分享漏洞分析思路

服务器开启端口监听并执行Java代码

最后反弹shell成功,说明恶意执行成功

漏洞分析

访问漏洞接口/webroot/decision/remote/design/channel发现

对环境文件的接口搜索一下发现

看到一个类com.fr.decision.extension.report.api.remote.RemoteDesignResource.onMessage,在idea全局搜搜索查看可以发现

这里就是channel的入口了,步入WorkContext.handleMessage()中

继续跟进messageListener.handleMessage()

看到this.deserializeInvocation(var1, var2),看着想序列化的方法,继续跟进

这里跟进看SerializerHelper.deserialize()

这里的var1是上面传的GZipSerializerWrapper.wrap(InvocationSerializer.getDefault()),跟进看

这里返回的是GZipSerializerWrapper()对象,同时this.serializer为InvocationSerializer对象再回到前面

var0被包装,送入到var1中的deserialize中,前面提到传入返回的对象为GZipSerializerWrapper()因此找到GZipSerializerWrapper.deserialize步入

这里对传入的包再次进行包装最后送入this.serializer.deserialize(var2),前面提到this.serializer对象在构造函数里被赋值了,为InvocationSerializer,最后再步入InvocationSerializer.deserialize

出现了,有两个readObject(),Java反序列化的触发点,总结

请求体传入的字节 	byte[] var0
包装1:			ByteArrayInputStream var1 = new ByteArrayInputStream(var0);
包装2:			GZIPInputStream var2 = new GZIPInputStream(var1)
包装3:			CustomObjectInputStream var3 = new CustomObjectInputStream(var2)反序列化:		   (Map)var3.readObject()

因此我们需要做的就是构造与几个包装刚好相反的触发链,根据web的包来看,发现其中自带CB1的链子

因此构造CB1链攻击,但是经过尝试,发现ysoserial生成的payload无法达到攻击目的且报了CB1的错

import com.fr.serialization.JDKSerializer;import java.io.*;
import java.util.Base64;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;public class Test {public static void main(String[] args) {try {String base64String = getBase64();byte[] bytes = Base64.getDecoder().decode(base64String);// 使用Java反序列化漏洞利用工具生成一个包含恶意代码的序列化对象,并将其序列化成字节数组byte[] maliciousBytes = bytes;// 构造一个GZIP格式的字节数组,将恶意字节数组存储在GZIP数据块中ByteArrayOutputStream baos = new ByteArrayOutputStream();GZIPOutputStream gzipOutputStream = new GZIPOutputStream(baos);gzipOutputStream.write(maliciousBytes);gzipOutputStream.finish();byte[] gzipBytes = baos.toByteArray();// 将GZIP格式的字节数组封装成一个输入流对象,并作为var0参数传入Env函数中InputStream var0 = new ByteArrayInputStream(gzipBytes);Env(var0);}catch (Exception e){e.printStackTrace();}}private static void Env(InputStream var0) throws IOException, ClassNotFoundException {GZIPInputStream var2 = new GZIPInputStream(var0);JDKSerializer.CustomObjectInputStream var3 = new JDKSerializer.CustomObjectInputStream(var2);Map map = (Map) var3.readObject();}private static String getBase64() {return "";}
}

当将yso的包替换后则成功,最后得出结论应该是yso CB1的链子无法应用于该系统,可能是版本不匹配,不过P牛文章中提到的链子可以

CommonsBeanutils与无commons-collections的Shiro反序列化利用 | 离别歌

可以弹calc,说明P牛的链子可以触发该环境自带jar包的CB1,因此利用了P牛的链子构造出复现中的EXP。

最后攻击的流量为被gzip压缩后带有Java反序列化特征的流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27778.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue+axios 使用CancelToken多次发送请求取消前面所有正在pendding的请求

需求: 项目中 折线图数据是循环调用的,此时勾选一个设备, 会出现多条线。 原因 折线图数据一进来接口循环在调用,勾选设备时,循环调用的接口有的处于pedding状态 ,有的还在加载中,这就导致勾…

Maven 继承、聚合、属性

文章目录 一、继承1.1. 概念1.2. 语法1.3. 示例1.4. 其他常见使用 二、聚合2.1. 概念2.2. 示例 三、属性3.1. Java 系统属性3.2.系统环境变量属性3.3.Maven 内置属性 一、继承 1.1. 概念 当项目较大,为了便于开发和管理,经常需要将工程划分成多个 Maven…

奇迹MU架设教程:SQL Server 2008数据库的安装教程

不管是搭建什么游戏,都是有数据库的,奇迹MU用的是SQL 数据库,根据服务器系统选择SQL server版本,我比较喜欢用Windows server 2008R2系统,所以我安装的是SQL server 2008。作为架设奇迹很重要的数据库程序,…

Day13 02-Linux常用命令汇总

文章目录 第三章 Linux的常用命令【重要】3.1 命令格式的说明3.2 帮助命令3.2.1 man3.2.2 help 3.3 文件处理命令3.3.1 cd3.3.2 ls3.3.3 pwd3.3.4 mkdir3.3.5 touch3.3.6 echo3.3.7 cp3.3.8 mv3.3.9 rm3.3.10 vi编辑器3.3.11 ln 3.4 查看命令3.4.1 cat3.4.2 more3.4.3 head3.4.…

【Linux】进程概念

【Linux】进程概念 文章目录 【Linux】进程概念1、冯诺依曼体系结构2、操作系统2.1 概念2.2 设计OS的目的2.3 定位2.4 管理2.5 系统调用和库函数概念 3、进程3.1 基本概念3.2 描述进程—PCB3.3 组织进程3.4 查看进程3.5 获取进程标示符3.6 创建进程-fork初识3.7 进程状态3.7.1 …

ADC 的初识

ADC介绍 Q: ADC是什么? A: 全称:Analog-to-Digital Converter,指模拟/数字转换器 ADC的性能指标 量程:能测量的电压范围分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示,比如&am…

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测,含混淆矩阵图、分类图)

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测,含混淆矩阵图、分类图) 目录 分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测,含混淆矩阵图、分类图…

Flutter:网络图像缓存插件——cached_network_image

前言 为什么要使用这个插件,有什么用呢?毕竟官方提供了Image.network来进行网络图片加载 Image.network和CachedNetworkImage都可以用于在Flutter中加载网络图片,但它们之间有一些区别。 Image.network是Flutter核心库提供的一个构造函数&…

2020年国赛高教杯数学建模D题接触式轮廓仪的自动标注解题全过程文档及程序

2020年国赛高教杯数学建模 D题 接触式轮廓仪的自动标注 原题再现 轮廓仪是一种两坐标测量仪器(见图1),它由工作平台、夹具、被测工件、探针、传感器和伺服驱动等部件组成(见图2)。   接触式轮廓仪的工作原理是&am…

阿里云推出“ModelScopeGPT”大模型调用工具,再添新贵

阿里云近日对外宣布将要推出其首款大模型调用工具——“魔搭GPT(ModelScopeGPT)”,从而为使用者们提供更为优质的人工智能应用支持。而作为阿里云人工智能产品家族中的新成员,这一创新工具也将进一步扩展阿里云在人工智能领域的影…

Stable Diffusion - ChatGPT4 与 Stable Diffusion 结合提供无限创意构图

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131782672 ChatGPT 和 StableDiffusion 结合使用的优势: 高效率:ChatGPT 可以在很短的时间内完成复杂的语言任务&#xf…

05 Docker 安装常用软件 (mongoDB)

目录 1. mongoDB简介 1.1 mongodb的优势 2. mongodb的安装 2.1 创建数据文件夹 2.2 备份日志 2.3 配置文件夹 2.4 创建两个文件 ---> 2.4.1 配置如下: 2.5 拉取mongodb 2.6 运行容器 2.7 进入mongodb容器 ---> 2.7.0 高版本(6.0)以上是这样的 , 旧版的没研究 …