Fastjson反序列化漏洞分析

这里写图片描述

1. 漏洞描述

  • 漏洞简述: 2017年3月15日,fastjson官方主动爆出fastjson在1.2.24及之前版本存在远程代码执行高危安全漏洞。攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。
  • 影响版本: fastjson <= 1.2.24

2. 漏洞简介

  java处理JSON数据有三个比较流行的类库,gson(google维护)、jackson、以及今天的主角fastjson,fastjson是阿里巴巴一个开源的json相关的java library,地址在这里,https://github.com/alibaba/fastjson,Fastjson可以将java的对象转换成json的形式,也可以用来将json转换成java对象,效率较高,被广泛的用在web服务以及android上,它的JSONString()方法可以将java的对象转换成json格式,同样通过parseObject方法可以将json数据转换成java的对象。

Fastjson序列化和反序列化:

  • Fastjson序列化:通过JSON.toJSONString()方法,将对象转化成JSON格式的字符串
  • Fastjson反序列化:JSON.parseObject()方法,将JSON格式的字符串转化成对象

3. 漏洞原理分析

3.1  源码补丁分析

通过github上发布的更新补丁的源码比较可以看到主要的更新在这个checkAutoType函数上,而这个函数的主要功能就是添加了黑名单,将一些常用的反序列化利用库都添加到黑名单中。

github补丁源码diff

这里写图片描述

这里构造了一个denyList数组,主要利用黑名单机制把常用的反序列化利用库都添加到黑名单中,主要有:

denyList = "bsh,com.mchange,com.sun.,java.lang.Thread,java.net.Socket,java.rmi,javax.xml,org.apache.bcel,org.apache.commons.beanutils,org.apache.commons.collections.Transformer,org.apache.commons.collections.functors,org.apache.commons.collections4.comparators,org.apache.commons.fileupload,org.apache.myfaces.context.servlet,org.apache.tomcat,org.apache.wicket.util,org.codehaus.groovy.runtime,org.hibernate,org.jboss,org.mozilla.javascript,org.python.core,org.springframework".split(",");

同时添加了checkAutoType类:

这里写图片描述

源码

public Class<?> checkAutoType(String typeName) {
            if (typeName == null) {
                 return null;
             }

             final String className = typeName.replace('$', '.');

             if (autoTypeSupport) {
                 for (int i = 0; i < denyList.length; ++i) {
                     String deny = denyList[i];
                     if (className.startsWith(deny)) {
                         throw new JSONException("autoType is not support. " + typeName);
                     }
                 }
             }

             Class<?> clazz = TypeUtils.getClassFromMapping(typeName);
             if (clazz == null) {
                 clazz = derializers.findClass(typeName);
             }

             if (clazz != null) {
                 return clazz;
             }

             for (int i = 0; i < acceptList.length; ++i) {
                 String accept = acceptList[i];
                 if (className.startsWith(accept)) {
                     return TypeUtils.loadClass(typeName, defaultClassLoader);
                 }
             }

             if (autoTypeSupport) {
                 clazz = TypeUtils.loadClass(typeName, defaultClassLoader);
             }

             if (clazz != null) {
                 if (ClassLoader.class.isAssignableFrom(clazz) || DataSource.class.isAssignableFrom(clazz)) {
                     throw new JSONException("autoType is not support. " + typeName);
                 }

                 if (derializers.get(clazz) != null) {
                     
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值