当前位置:   article > 正文

Fastjson反序列化漏洞分析_爬虫 autotypesupport denylist poc脚本

爬虫 autotypesupport denylist poc脚本

这里写图片描述

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(",");
  • 1

同时添加了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) {
                     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/870079
推荐阅读
相关标签
  

闽ICP备14008679号