Fastjson反序列化漏洞复现分析

本文深入分析了Fastjson的反序列化过程,详细讲解了从`parseObject`方法开始的解析流程,包括类加载、setter/getter绑定及属性值恢复等步骤。在漏洞版本分析部分,列举了1.2.24至1.2.68版本的漏洞利用细节和修复措施,讨论了如何通过缓存机制绕过安全检查。此外,还分享了一些有趣的payload,如$ref构造和toString触发。最后给出了相关参考资料链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x01 反序列化过程

fastjson将字符串转换为对象的方法主要有parse和parseObject

其中parseObject也会调用parse来解析json,下面来分析下反序列化过程

首先写一个测试的javabean

public class TestBean {
public String isMessage;
public String message;
public int id;
public String getMessage() {
System.out.println("getMessage called");
return message;
}
public void setMessage(String message) {
System.out.println("setMessage called");
this.message = message;
}
public TestBean() {
}
public TestBean(String message, int id) {
this.message = message;
this.id = id;
}
public int getId() {
System.out.println("getId called");
return id;
}
public void setId(int id) {
System.out.println("setId called");
this.id = id;
}
@Override
public String toString() {
return "TestBean{" +
"message='" + message + '\'' +
", id=" + id +
'}';
}
}

反序列化测试代码

import com.alibaba.fastjson.JSON;
public class Derjson {
public static void main(String[] args) {
String text = "{\"@type\":\"TestBean\",\"message\":\"hello\",\"id\":888}";
Object obj = JSON.parseObject(text);
  }
}

下断点调试,首先会进入

com.alibaba.fastjson.JSON#parseObject(java.lang.String)

可以看到该方法中调用了parse方法来解析json字符串,跟进该方法

图片

该方法中获取了一个json解析器,一路跟进到

com.alibaba.fastjson.parser.DefaultJSONParser#DefaultJSONParser(java.lang.Object, com.alibaba.fastjson.parser.JSONLexer, com.alibaba.fastjson.parser.ParserConfig)

会在该方法中盘断json字符串是否以{ 或[开头,然后分配不同的解析流程,以其他字符开头的后面的解析过程中会报错
图片
然后回到parse来,接着会进行解析json串的流程
图片

首先是创建一个JSONObject对象,执行

com.alibaba.fastjson.parser.DefaultJSONParser#parseObject(java.util.Map, java.lang.Object)方法

该方法主要是对json相应的结构进行拆解,获取相应的值,进行对应的处理

比如在匹配到@type 键值时,会对其对应的值进行类加载操作

图片
然后获取对应类的反序列化器
图片
跟进getDeserializer,在识别到类是一个普通的javabean时,会调用

com.alibaba.fastjson.parser.ParserConfig#createJavaBeanDeserializer

创建反序列化器,在该方法中又会使用:

com.alibaba.fastjson.util.JavaBeanInfo#build来绑定对应属性的setter

getter处理方法,对于setter方法的规定代码如下:

图片
图片

要求setter方法长度大于4,不是静态方法,返回类型是void或所在类的类型,参数个数是1,第四个字母需要大写

然后会把set去掉,第四位字母小写后作为属性值来和bean中的属性列表来对比,当属性成功被匹配到时,将setter方法与该属性绑定

当没有匹配到时,会将属性名首位大写然后在前面加上is来组成一个新的属性,然后继续将其与bean中的属性列表对比,成功匹配到后将is开头的属性值与setter绑定

图片
对于getter方法的规定如下
图片

要求getter方法大于4,不能是static方法,方法以get开头且第四位大写,方法不能有参数,返回值继承

Collection/Map/AtomicBoolean/AtomicInteger/AtomicLong ;

在绑定完方法后,就开始进行反序列化操作,利用绑定的方法恢复属性的值

值得注意的是,在反序列化的过程中,fastjson如果对json的字段找不到相应的方法时,会尝试对字段进行处理,反序列化方法

com.alibaba.fastjson.parser.d
根据提供的引用内容,fastjson反序列化漏洞是一种安全漏洞,攻击者可以利用该漏洞在目标系统上执行恶意代码。下面是fastjson反序列化漏洞复现过程[^1][^2]: 1. 判断是否使用Fastjson以及Fastjson版本:首先需要确定目标系统是否使用了Fastjson,并且确定Fastjson的版本号。可以通过查看项目的依赖文件或者代码中的导入语句来确定。 2. 漏洞复现:根据Fastjson的版本号选择相应的漏洞复现方法。 - Fastjson<1.2.24远程代码执行(CNVD-2017-02833):该漏洞可以通过构造恶意的JSON字符串来触发远程代码执行。攻击者可以在JSON字符串中插入恶意的Java代码,并通过反序列化操作执行该代码。 - Fastjson<=1.2.47远程代码执行漏洞(CNVD-2019-22238):该漏洞可以通过构造恶意的JSON字符串来触发远程代码执行。攻击者可以在JSON字符串中使用特殊的反射调用方式来执行恶意代码。 3. 防范措施:为了防止fastjson反序列化漏洞的利用,可以采取以下措施: - 及时升级Fastjson版本:Fastjson团队会及时修复漏洞并发布新版本,及时升级到最新版本可以避免被已知漏洞攻击。 - 输入验证和过滤:在接收用户输入并进行反序列化操作之前,对输入进行严格的验证和过滤,确保输入的数据符合预期的格式和内容。 - 使用安全的JSON库:考虑使用其他安全性更高的JSON库,如Jackson或Gson,来替代Fastjson
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值