fastjson 序列化 不包括转义字符_Fastjson小于1.2.68版本反序列化漏洞分析

前言

迟到的Fastjson反序列化漏洞分析,按照国际惯例这次依旧没有放poc。道理还是那个道理,但利用方式多种多样。除了之前放出来用于文件读写的利用方式以外其实还可以用于SSRF。

一、漏洞概述

在之前其他大佬文章中,我们可以看到的利用方式为通过清空指定文件向指定文件写入指定内容(用到第三方库)。当gadget是继承的第一个类的子类的时候,满足攻击fastjson的条件。此时寻找到的需要gadget满足能利用期望类绕过checkAutoType。

本文分析了一种利用反序列化指向fastjson自带类进行攻击利用,可实现文件读取、SSRF攻击等。

二、调试分析

1. 漏洞调试

从更新的补丁中可以看到expectClass类新增了三个方法分别为:

java.lang.Runnable、java.lang.Readable、java.lang.AutoCloseable

首先,parseObject方法对传入的数据进行处理。通过词法解析得到类型名称,如果不是数字则开始checkAutoType检查。

97585797e9013c540128ff2e09ab0b29.png

当传入的数据不是数字的时候,默认设置期望类为空,进入checkAutoType进行检查传入的类。

32ce124ce0b9083fa4280c5dfc17b50a.png

判断期望类,此时期望类为null。往下走的代码中,autoCloseable 满足不在白名单内,不在黑名单内,autoTypeSupport没有开启,expectClassFlag为false。

其中:

A.计算哈希值进行内部白名单校验

B.计算哈希值进行黑名单校验

C.非内部白名单且开启autoTypeSupport或者是期望类的,进行hash校验白名单acceptHashCodes、黑名单denyHashCodes。如果在acceptHashCodes内则进行加载( defaultClassLoader),在黑名单内则抛出 autoType is not support。

13f73efdd3871cbeb03790b539b0d71c.png

满足条件C后来到clazz的赋值,解析来的代码中对clazz进行了各种判断。

从明文缓存中取出autoCloseable赋值给 clazz。

664c2e1cc0ca08bceea694f1c28af2ce.png
43b41f2561e179f9ee47961442a87e97.png

当clazz不为空时,expectClassFlag为空不满足条件,返回clazz,至此,第一次的checkAutoType检查完毕。

f9065bfb847e2675ec1bf8e8f4bb3d06.png

将检查完毕的autoCloseable进行反序列化,该类使用的是JavaBeanDeserializer反序列化器,从MapDeserializer中继承。

4bd8b401f02c7a8ee31fda3f143f4430.png
76674f49feef3d6c483d76ceafb33a6f.png

JSON.DEFAULT_TYPE_KEY 为@type ,并给它赋值传入的key @type ,将第二个类也就是这次 的gadget传入。

5ddf549a076394dba26661c7ea536c73.png

期望类在这里发生了变化,expectClass的值变为java.lang.AutoCloseable,typeName为gadget,

90151c1085be2c5943d5893a5cab47a5.png

来到JSONType注解,取typename gadget转换变为路径,resource通过将 “.” 替换为”/“得到路径 。其实已经开始读取gadget了,它本意应该是加载AutoCloseable。

165fb916d51c28e3790b33434c74e7e2.png

可以看到这里有读取文件的功能。

1d0f052c4ea466617c05848ceed01bd1.png
a5733d86d622d902830d45f99dea1b02.png

isAssignableFrom()这个方法用于判断里面的类是否为继承类,当利用了java.lang.AutoCloseable这个方法去攻击fastjson,那么后续反序列化的链路一定是要继承于该类的子类。

TypeUtils.addMapping(typeName, clazz)这一步成功把gadget加入缓存中并返回被赋值gadget的clazz.

efccc75deafb681bead1cca646becdf6.png

checkAutoType正式检查完毕,此时用deserializer = parser.getConfig().getDeserializer(userType); userType既gadget进行反序列化。

439fe3c2fc6630b5c59185dc7b2a210b.png

进入coreConnect()

7f4e2c269a426e3de585fdfab2b0cfc8.png
187e0be532aa19f4f45129f402e83d26.png

在这里进行连接。至此漏洞利用完结。

2. 总结:

在本次反序列化漏洞中,笔者认为关键点在于找到合适并且可利用的常用jar包中的gadget。gadget在被反序列化后即可执行类里的恶意的功能(不仅限于RCE还包括任意文件读取/创建,SSRF等)。也可以使本漏洞得到最大化的利用。

三、参考考链接

https://b1ue.cn/archives/348.html

https://daybr4ak.github.io/2020/07/20/fastjson%201.6.68%20autotype%20bypass/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值