Fastjson反序列化漏洞

判断:

正常请求是get请求并且没有请求体,可以通过构造错误的POST请求,即可查看在返回包中是否有fastjson这个字符串来判断。

1.什么是json

json的全称是JavaScript object notation,即JavaScript对象标记法,使用键值对进行信息的储存。

json本质就是一种字符串用于信息的存储和交换

2.什么是fastjson

fastjson是一个有阿里开发的一个开源Java类库,可以i将Java对象转换为json格式(序列化),当然它也可以将json字符串转换为java对象(反序列化)。fastjson可以操作任何java对象,即使是一些预先存在的没有源码的对象(fastjson反序列化漏洞来源)

3.fastjson序列化/反序列化原理

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

为什么要引进Auto Type功能

fastjson在序列化以及反序列化的过程中并没有使用java自带的序列化机制,而是自定义了一套机制。其实对json框架来说,想要将一个java对象转换成字符串可以有两种选择

1.基于setter/getter

存在问题:当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去(apple/iphone)只保留接口的类型(Fruit),最后导致反序列化时无法得到原始类型

2.基于属性(Auto Type)

为了解决上述问题: fastjson引入了基于属性(AutoType),即在序列化的时候,先把原始类型记录下来。使用@type的键记录原始类型

4.fastjson反序列化漏洞原理

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

常见的有sun官方提供的一个类com.sun.rowset.JdbcRowSetImpl,其中有个dataSourceName方法支持传入一个rmi的源,只要解析其中的url就会支持远程调用!

1.访问目标站点,brupsuit拦截,以json格式添加恶意类信息发送到目标机

2.目标机将发送恶意json反序列化,加载执行,访问自构造rmi服务器请求待执行命令

3.rmi服务器请求加载远程机器的class类

4.rmi将远程加载得到的class(恶意代码),作为响应返回给目标机

5.目标机执行了恶意代码被利用

https://blog.csdn.net/Bossfrank/article/details/130100893

fastjson不出网怎么利用

#目前公开已知的poc有两个:

com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl

org.apache.tomcat.dbcp.dbcp2.BasicDataSource

#第一种利用方式需要一个特定的触发条件:

解析JSON的时候需要使用Feature才能触发,参考如下代码:

JSONObject.parseObject(sb.toString(), new Feature[]

{Feature.SupportNonPublicField});

#第二种利用方式: 则需要应用部署在Tomcat应用环境中,因为Tomcat应用环境自带

tomcat-dbcp.jar 对于SpringBoot这种自带Tomcat可以直接以单个jar文件部署的需要

在maven中配置tomcat- dbcp。

而且对于不同的Tomcat版本使用的poc也不同:

Tomcat 8.0以后使用

org.apache.tomcat.dbcp.dbcp2.BasicDataSource• Tomcat

8.0以下使用 org.apache.tomcat.dbcp.dbcp.BasicDataSou

无回显怎么办:

1.一种是直接将命令执行结果写入到静态资源文件里,如html、js等,然后通过http访问就可以直接看到结果

2.通过dnslog进行数据外带,但如果无法执行dns请求就无法验证了

3.直接将命令执行结果回显到请求Poc的HTTP响应中

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...