)
Posted 区块链市场观察家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了)相关的知识,希望对你有一定的参考价值。
文章目录
Json数据格式
JSON是一种轻量级的数据交换格式,全称:javascript 对象表示法(JavaScript Object Notation)
类比XML,你可以把JSON看作是一种存储数据的格式类型,一种数据规范。描述JSON格式数据的语法只是采用了JS对象字面量的表示方法,它独立于语言存在,只是在不同的编程语言中对这种数据类型的实现不同。
参考文章:JSON与JS的联系
FastJson类库
Json的三个类库
Java处理JSON数据有三个比较流行的类库,用于互相转换 Java 对象和 Json 数据。
类库 | 说明 |
---|---|
Gson | google维护 |
Jackson | - |
Fastjson | 阿里巴巴开源项目,得到广泛应用 |
其中 Fastjson 是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
使用 FastJson 类库转换数据格式,使用到的 2 个函数如下。
函数 | 说明 |
---|---|
JSONString() | 把 Java 对象转换成 Json 数据 |
parseObject() | 把 Json 转换成 Java 对象 |
下载Jar压缩包
在eclipse JavaEE平台下,访问 项目地址,下载最新版 Jar 包得到 Fastjson-1.2.53.jar
,然后把 Jar 压缩包导入 Eclipse 工程。开发时即可使用 FastJson 类及其函数等。
Autotype功能
FastJson 的 Autotype 功能存在漏洞,该功能可以反序列化的时候人为指定精心设计的类,达成远程命令执行。
1.开发环境的部署和访问
查看 项目Wiki,在 IDEA 中使用 Maven 项目进行 FastJson 测试。配置 Maven 项目,参考 IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
FastJson的基本使用(执行反序列化操作)
使用测试类熟悉 FastJson的基本使用 和 2 个互转函数:JSONObject.toJSONString()
和 JSONObject.parseObject()
,主要代码如下,文件代码见文末
JSONObject.toJSONString(person1);
JSONObject.toJSONString(person2, SerializerFeature.WriteClassName);
JSONObject.parseObject(str1);
Autotype功能:允许用户在序列化数据中通过 @type 指定反序列化的 Class 类型。
- 具有特性:反序列化过程中会触发 get、set 函数
反序列化函数:
- JSONObject.parse()会识别并调用目标 class 的 set 类函数
- JSONObject.parseObject()会触发构造函数、get类函数、set类函数
- parseObject()函数其实也是调用了 parse 函数
对比如下 php 反序列化漏洞的利用条件,此处目前只是执行反序列化操作。
- 对输入的序列数据执行反序列化操作
- 有跳板函数
参考视频:《JAVA WEB安全攻防技术培训 fastjson反序列化1》
FastJson漏洞概况
2017年Fastjson远程命令执行漏洞
- 公布时间:2017-03-15
- 涉及类库版本:Fastjson小于1.2.24的所有版本
- Poc适用版本:Fastjson-1.2.22到1.2.24区间
- 修复版本:大于1.2.25
2019年Fastjson远程命令执行漏洞
- 公布时间:2018年发现漏洞,2019年公布
- 涉及类库版本:FastJSON 1.2.48以下版本
参考:fastjson复现
漏洞检测(Fastjson scan)
在云服务器上安装 docker 和 vulhub,使用 vulhub 的两个版本漏洞进行测试。
FastJson 1.2.24 RCE 靶场(成功检测):访问页面返回 Json 数据。
使用 Fastjson scan插件,需要以Post方式传入非空数据才会执行扫描,否则显示 not supported。扫描用时100秒左右,成功检测 vul 。
FastJson 1.2.47 RCE 靶场(成功检测):扫描用时 128 秒。
能用就行。但有一点不好的是,每次重启 bp 都要重新加载插件。
漏洞复现
漏洞原理简述
涉及知识储备:Jndi注入 。Jndi注入的利用方式如下,先去补充 JNDI 注入的知识。
- 基于rmi
- 基于ldap
- 基于BeanFactory
参考:fastjson漏洞复现 、浅谈Fastjson RCE漏洞的绕过史 、Java_JSON反序列化之殇_看雪安全开发者峰会.pdf
FastJson基本使用代码
使用测试类熟悉 FastJson的基本使用 和 2 个互转函数的文件代码
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class FastJsonTest
public static void main(String[] args)
Person person1 = new Person();
person1.setName("pump");
person1.setAge(18);
String str1 = JSONObject.toJSONString(person1);
System.out.println(str1);
Person person2 = new Person();
person1.setName("watermelon");
person1.setAge(2);
String str2 = JSONObject.toJSONString(person2, SerializerFeature.WriteClassName);
System.out.println(str2);
// 把Json Str转换成Object的代码在视频里
public class Person
private String name;
private Integer age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public Integer getAge()
return age;
public void setAge(Integer age)
this.age = age;
FastJson 1.2.24 Rce复现图
参考
以上是关于)的主要内容,如果未能解决你的问题,请参考以下文章