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

news2024/9/24 17:13:11

事件背景

热点漏洞

漏洞说明

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.coloradmin.cn/o/798340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你轻松又简单的绘制地铁线路图

地铁是主要以地下运输为主的交通系统。其轨道通常在地下隧道内。其中:地铁线路中的M,L,S,R分别代表:MMetro地,LLight轻轨,SSuburb市郊铁路,Rrapid,快速铁路。地铁线路图则可以简单理解为地铁的运行路线轨道…

基于Java+SpringBoot+vue前后端分离足球青训俱乐部管理后台系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

【自动话化运维】Ansible常见模块的运用

目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1.command 模块3.2.shell 模块3.3.cron 模块3.4.user 模块3.5.group 模块3.6.copy 模块3.7.file 模块8&#xff…

Java阶段五Day15

Java阶段五Day15 文章目录 Java阶段五Day15分层其他依赖dao-apidao-implinfrustructuredomainadaptermain 测试整合项目main前台师傅功能luban-front配置师傅相关表格ER图ER练习案例鲁班表格ER关系(非常重要) 前台师傅接口——师傅入驻adapterdomaininfr…

【C语言】指针进阶(二)

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

使用xtcp映射穿透指定服务

使用xtcp映射穿透指定服务 管理员Ubuntu配置公网服务端frps配置service自启(可选) 配置内网服务端frpc配置service自启(可选) 使用者配置service自启(可选) 通过frp实现内网client访问另外一个内网服务器 管理员 1)配置公网服务端frps2)配置内网服务端…

2023年 React 最佳学习路线

CSS CSS JavaScript JavaScript TypeScript 目前没有找到比其他文档好很多的文档地址 可以先看官网 React 新版 React 官方文档无敌 React React-router-dom V5 V6 Webpack webpack Antd antd

基于贴花的热力图呈现方法参考

首先是热力图信息类: using System; using UnityEngine;[Serializable] public class HeatMapInfo {public Rect rect Rect.zero;public float pixelDensity 1;public float valBase 0;public float valRange 1;public PercentColor[] ribbon;//色带public Col…

关联分析-Apriori

关联分析-Apriori 1. 定义 关联分析就是从大规模数据中,发现对象之间隐含关系与规律的过程,也称为关联规则学习。 2. 相关概念 2.1 事务、项与项集 订单号购买商品0001可乐、薯片0002口香糖、可乐0003可乐、口香糖、薯片 以上面的订单为例&#xf…

一套流程6个步骤,教你如何正确采购询价

采购询价(RFQ)是一种竞争性投标文件,用于邀请供应商或承包商就标准化或重复生产的产品或服务提交报价。 询价通常用于大批量/低价值项目,买方必须提供技术规格和商业要求,该文件有时也称为招标书或投标邀请书。询价流…

客户问题解决平台-帮助与支持中心

在现代企业中,帮助与支持中心扮演着至关重要的角色。随着市场的竞争日趋激烈,客户对于产品和服务的期望也越来越高。因此,建立一个高效的客户问题解决平台是企业成功的关键之一。本文将探讨帮助与支持中心的作用,介绍其功能和优势…

Linux(二)--Linux基础命令

我们在前面学习的Linux命令,其实它们的本体就是一个个的二进制可执行程序。 和Windows系统中的.exe文件,是一个意思。 一.Linux的目录结构 Linux的目录结构是一个树形结构。 Windows系统可以拥有多个顶级目录,称之为盘符,如C盘&…

Journal of Information Security and Applications (JISA) 投稿经验分享

Journal of Information Security and Applications (JISA) 投稿经验分享 基本情况: 中科院三区 JCR Q2 2023影响因子:5.6 老牌信息安全类期刊 投稿经验: With editor 周期: 1-2个月,稍微有点慢 Under review 周期: 2…

Nautilus Chain 即将发行治理通证 NAUT ,生态发展进程加速

独特且优势明显的 Nautilus Chain 目前,行业内首个模块化底层 Nautilus Chain 已经上线主网,并且即将有超过 70 个应用原生部署在 Nautilus Chain 上。Nautilus Chain 本身是一个以 Layer3 为定位的区块链系统,其通过 Celestia 模块化底层来获…

C++初阶之一篇文章让你掌握string类(模拟实现)

string类模拟实现 1.为什么要模拟实现string2.string的模拟实现需要注意哪些问题3.经典的string类问题4.写时拷贝5.传统版写法的String类(参考)6.现代版写法的String类(参考)7.string类的模拟实现(讲解)7.1…

Vue基础-综合案例(基于vue2)

一、目标 能够知道如何使用vue-cli创建vue项目能够知道如何在项目中安装与配置element-ui能够知道element-ui中常见组件的用法能够知道如何使用axios中的拦截器能够知道如何配置proxy接口代理 二、目录 vue-cli组件库axios拦截器proxy跨域代理用户列表案例 vue-cli 1.什么…

浅谈密码学的由来

目录 1.什么是密码学 2.密码学的发展 3.密码学的应用 4.密码学未来的发展趋势 1.什么是密码学 密码学是关于安全通信的科学研究,它研究如何在敌对环境中保护通信的机密性、完整性和身份验证。密码学涉及使用各种算法和技术来加密和解密信息,以确保只有…

C++基础算法⑤——递推算法(昆虫繁殖 过河卒 Pell数列 上台阶 流感传染 移动路线)

递推掌握核心&#xff1a; 递推公式(规律)递推边界(初始化条件) 分析题目意思&#xff1a;如下图 递推式&#xff1a;a[n] a[n-1]a[n-2]; 递推边界&#xff1a;a[1]1 a[2]2 #include<iostream> using namespace std; long long a[100],x,y,z; int main(){ //昆虫繁衍…

c++类和对象(拷贝构造、运算符重载、初始化列表、静态成员、友元等)

一、拷贝构造 拷贝构造函数的特征&#xff1a; 1、拷贝构造函数是构造函数的一个重载形式&#xff1b; 2、拷贝构造函数的参数只有一个且必须是同类类型对象的引用&#xff0c;使用传值方式编译器直接报错&#xff0c;因为会引发无穷递归调用。 在c中自定义类型传值传参的时…

vue中的.env文件分析

问题说明 有米有小伙伴&#xff0c; 在看一个新鲜的项目的时候&#xff0c; 会发现在项目中会有类似于下方的文件。 那这些文件是干什么的呢&#xff1f; 它们在项目中会有什么作用呢&#xff1f; 如何调用这些文件的呢 问题解答 0&#xff0c;对于vue中模式与环境变量的说…