Fastjson反序列化

发布时间 2023-07-17 21:13:18作者: i苏沐辰

Fastjson反序列化漏洞

fastjson是阿里巴巴公司推出的一个用于快速处理json数据的java类库,这个库由于在传输json数据的时候,中间有一个标识,这个标识允许用户传入一个类名,因此攻击者可以传入他想要执行的类,通过执行这个类,调用rmi方法,去执行他部署的一个恶意方法

json

一种特殊的数据格式,和各种数据格式转化的时候,稳定且友好

完全独立于编程语言的文本格式来存储和表示数据,易于人阅读和编写。同时也易于机器解析和生成。任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。

fastjson(alibaba)

fastjson这个类库可以很快速的对json数据进行转化

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

Fastjson 可以操作任何 java对象

AutoType

想要把java对象转换为json字符串可以有两种选择:1.基于属性2.基于setter/getter

​ fastjson在把对象转换为字符串时就是通过遍历该类目所有的getter方法进行的。

​ 但是当一个类只有一个接口的时候在使用这个进行序列化的时候,就会将子类抹去只保留接口的类型,最后导致反序列化无法得到原始类型。

​ 那为了解决这个问题就是引进了autotype(在序列化时,把原始类型记录下来)。它使用的方法是SerializerFeature.WriteClassName进行标记的。

使用SerializerFeature.WriteClassName进行标记后,JSON字符串中多出了一个@type字段,标注了类对应的原始类型,方便在反序列化的时候定位到具体类型

​ 也正是因为引进了autotype才导致了漏洞!

漏洞原理

因为引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到type到内容,将json内容反序列化为java对象并调用这个类的setter方法。

那是不是可以利用这个特性,自己构造json字符串然后使用@Type标记指定一个自己想要使用的攻击类库。然后fastjson会自己构造的json字符串反序列化然后执行。

1.攻击者访问目标网站,通过burpsuite抓包,以json格式添加jdbcrowsetlmpl恶意类信息发送给目标机。

2.目标机对json反序列化时候,会加载执行攻击者构造的信息(访问rmi服务器),rmi给靶机下发命令。

\3. 靶机得到rmi的服务的相应,去执行dnslog类。

poc

image

1、 需要有一个恶意方法

2、 java源代码利用javac编译生成class后缀的文件

3、 攻击者需要有一个rmi的服务

4、 先用python启动一个web服务。8088

5、 利用marshalsec-0.0.3-SNAPSHOT-all.jar工具在9001端口启动一个rmi服务,这个rmi启动需要依赖web

rmi

RMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。

防护

image

image

神奇的L;

image