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
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)。
防护
神奇的L;
标签:Fastjson,fastjson,rmi,Java,json,字符串,序列化 From: https://www.cnblogs.com/2210z/p/17561227.html