是什么

Fastjson

json是什么

json:Json是一种轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

{

​ "name":"BossFrank",

​ "age":23,

​ "media":["CSDN","bilibili","Github"]

}

Fastjson:是一个Java库,可用于将Java对象转换为其JSON表示。它还可用于将JSON字符串转换为等效的Java对象。Fastjson可以处理任意Java对象,包括您没有源代码的预先存在的对象

Fastjson漏洞的形成

fastjson的漏洞本质还是一个java的反序列化漏洞,由于引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到@type的内容,将json内容反序列化为java对象并调用这个类的setter方法。

fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,而是自定义了一套机制

对于JSON框架来说,想要把一个Java对象转换成字符串有两种方法

1.基于setter/getter

2.基于属性(AutoType)

基于setter/getter

class Apple implements Fruit {
private Big_Decimal price;
//省略 setter/getter、toString等
}

class iphone implements Fruit {
private Big_Decimal price;
//省略 setter/getter、toString等
}

当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去,只保留接口的类型,最后导致反序列化时无法得到原始类型。本例中,将两个json再反序列化生成java对象的时候,无法区分原始类是否是别的子类。

基于AutoType

为了解决上述问题: fastjson引入了基于属性(AutoType),即在序列化的时候,先把原始类型记录下来
{ “fruit”:{ “@type”:”com.hollis.lab.fastjson.test.Apple”, “price”:0.5 } }

引入AutoType后,iphone类对象序列化为json格式后为:

{ "fruit":{ "@type":"com.hollis.lab.fastjson.test.iphone", "price":5000 } }

漏洞原理

使用AutoType功能进行序列号的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

漏洞利用流程

攻击者(我们)访问存在fastjson漏洞的目标靶机网站,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetImpl恶意类信息发送给目标机。
存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。也就是靶机服务器问rmi服务器,(靶机服务器)需要执行什么命令啊?
rmi 服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者(我们)构造好的命令(ping dnslog或者创建文件或者反弹shell啥的)rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
靶机服务器执行了恶意代码,被攻击者成功利用。
1719025936008

拓展

fastjson不出网怎么利用

TemplatesImpl利用连

版本 1.2.24
苛刻条件:

  1. 服务端使用parseObject()时,必须使用如下格式才能触发漏洞: JSON.parseObject(input, Object.class, Feature.SupportNonPublicField);
  2. 服务端使用parse()时,需要 JSON.parse(text1,Feature.SupportNonPublicField)
    这是因为com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl需要赋值的一些属性为private 属性,要满足private属性的数据。所以比较苛刻,完全凭运气

apache-BCEL,直接传入字节码不需要出网就可执行恶意代码但是需要引入tomcat的依赖,但在实际攻击中还算是比较常见的。

fastjson不出网利用
fastjson≤1.2.24

条件:BasicDataSource只需要有dbcp或tomcat-dbcp的依赖即可,dbcp即数据库连接池,在java中用于管理数据库连接,还是挺常见的。

参考链接:

Boss_frank-CSDN博客

[fastjson反序列化漏洞演示加详细讲解加原理_哔哩哔哩_bilibili

fastjson-BCEL不出网打法原理分析_fastjson不出网是什么-CSDN博客](https://www.bilibili.com/video/BV1Ab4y1d7w1/?vd_source=e52c0be348f431bd52ecb6f73987ebbd)