Fastjson反序列化漏洞基础

FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象。

0x0 简单使用

pom.xml加入FastJson

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>

新建一个User1类,注意这个类有两个属性age和name,并且其两个属性都有get/set方法:

package com.yy.FastJson.demo;

public class User1 {
private String name; public User1() {
System.out.println("User()");
} public String getName() {
System.out.println("getName()");
return name;
} public void setName(String name) {
System.out.println("setName()");
this.name = name;
}
}

0x1 Fastjson的序列化

fastjson是用toJSONString方法来进行的序列化,使用方法:

package com.yy.FastJson.demo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature; public class serialize {
public static void main(String[] args){
User student = new User();
student.setName("yangyang");
String st = JSON.toJSONString(student, SerializerFeature.WriteClassName);
System.out.println(st);
}
}

这里输出结果为:

可以看到在序列化成json字符串时候会调用get方法,而这里的SerializerFeature.WriteClassName是toJSONString()方法中的一个属性值,设置之后在序列化的时候会多写入一个@type,后面指定反序列化的类名

# 设置了SerializerFeature.WriteClassName属性
{"@type":"com.yy.FastJson.demo.User1","name":"yangyang"} # 未设置SerializerFeature.WriteClassName属性
{"name":"yangyang"}

0x2 Fastjson的反序列化

在fastjson中,有三种方式进行反序列化:

JSON.parse(json)

JSON.parseObject(json)

JSON.parseObject(json, User.class)

新建一个unserialize类来理解这三个方法的区别:

package com.yy.FastJson.demo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; public class unserialize {
public static void main(String[] args){
String json ="{\"@type\":\"com.yy.FastJson.demo.User1\",\"name\":\"yangyang\"}"; System.out.println("parse(json)");
User1 obj01 = (User1)JSON.parse(json);
System.out.println(obj01);
System.out.println("--------------------------------------"); System.out.println("parseObject(json)");
JSONObject obj02 = JSON.parseObject(json);
System.out.println(obj02);
System.out.println("--------------------------------------"); System.out.println("parseObject(json, User.class)");
User1 obj03 = JSON.parseObject(json, User1.class);
System.out.println(obj03);
}
}

输出结果:

parse(json)
User()
setName()
com.yy.FastJson.demo.User1@6d21714c
--------------------------------------
parseObject(json)
User()
setName()
getName()
{"name":"yangyang"}
--------------------------------------
parseObject(json, User.class)
User()
setName()
com.yy.FastJson.demo.User1@5b80350b

可以看到,只有parseObject(json)调用了getName方法

其原因是因为parseObject(json) 本质上也是调用 parse(json) 进行反序列化的。但是 parseObject(json) 会额外的将Java对象转为 JSONObject对象,即 JSON.toJSON(),所以会多调用一个get方法

引出问题:是不是除了parseObject(json) ,其余两种方式是无法调用get方法的呢

新建一个User2,加入一个age方法,并且类型是Properties

import java.util.Properties;

public class User2 {
private String name;
private Properties age; public User2() {
System.out.println("User()");
} public String getName() {
System.out.println("getName()");
return name;
} public void setName(String name) {
System.out.println("setName()");
this.name = name;
} public Properties getAge() {
System.out.println("getAge()");
return age;
} public Properties setAge() {
System.out.println("setAge()");
return age;
}
}

修改unserialize里面得User1成User2

package com.yy.FastJson.demo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; public class unserialize {
public static void main(String[] args){
String json ="{\"@type\":\"com.yy.FastJson.demo.User2\",\"name\":\"yangyang\",\"age\":{ }}"; System.out.println("parse(json)");
User2 obj01 = (User2)JSON.parse(json);
System.out.println(obj01);
System.out.println("--------------------------------------"); System.out.println("parseObject(json)");
JSONObject obj02 = JSON.parseObject(json);
System.out.println(obj02);
System.out.println("--------------------------------------"); System.out.println("parseObject(json, User.class)");
User2 obj03 = JSON.parseObject(json, User2.class);
System.out.println(obj03);
}
}

运行结果:

parse(json)
User()
setName()
getAge()
com.yy.FastJson.demo.User2@4459eb14
--------------------------------------
parseObject(json)
User()
setName()
getAge()
getAge()
getName()
{"name":"yangyang"}
--------------------------------------
parseObject(json, User.class)
User()
setName()
getAge()
com.yy.FastJson.demo.User2@4f2410ac

可以看到,所有的getAge方法都调用了一次。

这里除了parseObject(json)会直接调用getAge()外,其他两种方式调用getAge方法是有条件的。

条件一、方法名需要长于4

条件二、不是静态方法

条件三、以get字符串开头,且第四个字符需要是大写字母

条件四、方法不能有参数传入

条件五、继承自Collection || Map || AtomicBoolean || AtomicInteger ||AtomicLong

条件六、此getter不能有setter方法(程序会先将目标类中所有的setter加入fieldList列表,因此可以通过读取fieldList列表来判断此类中的getter方法有没有setter)

更详细的解析可以看看这篇文章:

https://www.anquanke.com/post/id/211035#h3-3

为了方便记忆,拿了一张大佬的图:

图片来源:https://www.cnblogs.com/sijidou/p/13121332.html?ivk_sa=1024320u

parseObject(json)会直接调用get方法,其他的则需要满足条件

所以,在反序列化的时候,会把目标类的构造函数、getter方法、setter方法、is方法执行,如果此时这四个方法中有危险操作,则会导致反序列化漏洞。

参考:

https://www.anquanke.com/post/id/211035#h2-5

https://blog.csdn.net/qq_34101364/article/details/111706189

Fastjson反序列化漏洞基础的更多相关文章

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

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

  2. Fastjson反序列化漏洞概述

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

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

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

  4. fastjson反序列化漏洞实际案例利用

    fastjson反序列化rce实际案例利用全过程: 存在问题网站:http://***.com/ 在网站上寻找一些安全漏洞的时候,发现一条json数据包 数据包如下: POST /*** HTTP/1 ...

  5. Fastjson反序列化漏洞复现

    Fastjson反序列化漏洞复现 0x00 前言 对Fastjson反序列化漏洞进行复现. 0x01 漏洞环境 靶机环境:vulhub-fastjson-1.2.24 ip:172.16.10.18 ...

  6. JAVA反序列化漏洞基础原理

    JAVA反序列化漏洞基础原理 1.1 什么是序列化和反序列化? Java序列化是指把Java对象转换为字节序列的过程: Java反序列化是指把字节序列恢复为Java对象的过程: 1.2 为什么要序列化 ...

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

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

  8. .NET高级代码审计(第三课)Fastjson反序列化漏洞

    0X00 前言 Java中的Fastjson曾经爆出了多个反序列化漏洞和Bypass版本,而在.Net领域也有一个Fastjson的库,作者官宣这是一个读写Json效率最高的的.Net 组件,使用内置 ...

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

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

随机推荐

  1. python3.7安装和pycharm安装教程. 以及pycharm的破解教程

    前言: 供对python初学者查阅, pycharm破解教程参阅了: https://blog.csdn.net/u014044812/article/details/78727496 1. 安装py ...

  2. 有赞Android实习五面都挂了,复习半月再战,转拿腾讯offer!

    缘起 为了有赞的面试准备了半个月的样子,当时还投了美团.字节.滴滴.京东,目的只有一个,就是要进大厂,但是只有有赞扛过了一面,其他都是一面就挂了. 前三面都自我感觉良好,以为能稳拿offer的,没想到 ...

  3. MySQL:获取元数据

    元数据就是描述数据的数据,在很多时候我们都需要查询元数据 比如:想知道数据库有多少个表,表里面有哪些字段,数据表是什么时候创建的.在什么时候更新过等等 使用SQL注入的时候也得获取数据库的元数据才能进 ...

  4. .NET Core/.NET5/.NET6 开源项目汇总12:WPF组件库2

    系列目录     [已更新最新开发文章,点击查看详细] WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Frame ...

  5. 痞子衡嵌入式:i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项. 最近痞子衡在支持一个印度客户,这个客户项目主芯片选择 ...

  6. Kafka丢数据、重复消费、顺序消费的问题

    面试官:今天我想问下,你觉得Kafka会丢数据吗? 候选者:嗯,使用Kafka时,有可能会有以下场景会丢消息 候选者:比如说,我们用Producer发消息至Broker的时候,就有可能会丢消息 候选者 ...

  7. 一文搞懂B树、B-树、B+树

    前言 B树和B-树是同一种数据结构,如果不清楚的话,会被面试官忽悠,所以本文介绍两种数据结构,B树和B+树,废话不多数咱们开干. B树 介绍 在计算机科学中,B树是一种自平衡的树,能够保持数据有序.这 ...

  8. 基于css的一些动画

    最近因为期末复习周,博客更新鸽了很久,趁着考完试还记得这件事,把之前的大作业里出现过的css动画总结一下 页脚的联系方式图标 这个图片原型是一个静态图 动画效果如下 html <div clas ...

  9. 软件研发中也有5S 管理?

    在精益生产中,价值流是贯穿生产全程的关键要素,标准化作业是实现生产线同步的关键工具,而生产现场的5S 管理则是管理一切生产要素的基础,所以我们将5S 称为精益的基础并不为过.5S 管理不仅可以应用到车 ...

  10. 数据结构解析-HashMap

    概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,改为了由 数组+链表+红黑树实现,主要的目的是提高查找效率. 如图所示: JDK版本 ...