fastjson漏洞分析
字数 1903 2025-08-11 17:40:24

Fastjson漏洞分析与利用全面指南

1. Fastjson简介

Fastjson是阿里巴巴开源的一个Java库,用于:

  • 将Java对象转换为JSON表示形式
  • 将JSON字符串转换为等效的Java对象
  • 处理任意Java对象,包括没有源代码的预先存在的对象

核心功能示例:

// 对象转JSON
String jsonString = JSON.toJSONString(userObject);

// JSON转对象
User user = JSON.parseObject(jsonString, User.class);

2. JSON框架识别技术

不同JSON框架的识别特征

  1. Jackson:

    • 严格要求与bean对象对齐(可少不可多)
    • 无法解析单引号
    • 无法识别注释符
  2. Gson:

    • 浮点数无法转整数(会报错)
    • 遇到#会当作注释符处理
    • 拼接JSON字符串时会报错
  3. org.json:

    • 插入\n、\r等字符会改变输出
    • 结合#注释符处理
  4. Fastjson:

    • 浮点精度不丢失
    • 对@type做出特定响应
    • 可通过DNSLOG探测

Fastjson探测方法

  1. DNSLOG探测:

    • 高效的无回显探测方法
    • 适用于出网环境
    • 示例payload: {"@type":"java.net.Inet4Address","val":"dnslog.domain"}
  2. 响应状态探测:

    • 观察对@type的响应行为
    • 特定错误信息特征

3. Fastjson版本探测

有回显情况

  • 通过构造特定payload触发报错显示版本号
  • 示例:破坏FastJsonHttpMessageConverter的既定结构

无回显DNSLOG探测

  • 关键版本识别标志:
    • 1.2.47
    • 1.2.68
    • 1.2.80
  • 使用不同类进行探测:
    • java.lang.Class
    • java.lang.AutoCloseable
    • java.lang.Exception

版本特征:

  • 1.2.68和1.2.80只会接收到第一个DNSLOG请求
  • 1.2.83会收到第二个请求

4. 利用链探测技术

  1. Character报错回显:

    • 当类存在时将Class强转为Char导致报错
    • 可用于确认类是否存在
  2. Class回显:

    • 类存在时返回类实例
    • 体现在服务器响应变化
  3. DNSLOG外带:

    • 高难度利用方式
    • 对操作系统和DNS服务器有要求

5. Fastjson漏洞历史与利用

漏洞版本时间线

  1. <=1.2.24:

    • 最初漏洞版本,无任何校验
    • 任意反序列化利用
    • 常用payload:
      • JdbcRowSetImpl
      • TemplatesImpl
      • bcel
  2. 1.2.25-1.2.45:

    • 引入checkAutoType机制和黑名单
    • 手动开启autotype时可绕过黑名单
  3. <=1.2.47:

    • 缓存通杀漏洞
    • 不开启AutoTypeSupport也可构造任意反序列化
    • 对于1.2.25-1.2.32需关闭AutoTypeSupport
  4. <=1.2.68:

    • 新增expectClass判断
    • 可通过expectClass绕过autoType检查
  5. <=1.2.80:

    • expectClass属性引入导致新漏洞
    • checkAutoType中对expectClass的判断问题

绕过技术演进

  1. 1.2.41:

    • 加L绕过(如@type":"Lcom.sun.rowset.JdbcRowSetImpl;
  2. 1.2.42:

    • 双写L绕过(如LLcom.sun.rowset.JdbcRowSetImpl;;
  3. 1.2.43:

    • 加[{绕过(如{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{...}

6. WAF绕过技术

  1. 编码绕过:

    • Fastjson自动进行hex解码和unicode解码
    • 示例:使用编码后的key/value
  2. 字符填充:

    • 传统WAF绕过思路
    • 大量无用字符填充
  3. DOS漏洞:

    • Fastjson 1.2.36-1.2.62存在DOS漏洞
    • 1.2.80后推出noAutoType版本但未修复DOS漏洞

7. 高级利用技术

Fastjson -> CodeQL分析

  • 可用于寻找调用链
  • 示例:寻找Shiro调用链
    • source点:类的Field
    • sink点:lookup方法
  • 已发现3条调用链

黑名单分析

  • Fastjson采用黑名单防御机制
  • 黑名单项目参考:https://github.com/LeadroyaL/fastjson-blacklist
  • 黑名单机制存在固有缺陷,建议使用Fastjson2

8. 防御建议

  1. 升级到Fastjson2
  2. 禁用AutoType功能
  3. 严格过滤输入
  4. 使用最新安全版本
  5. 监控异常DNS请求

9. 参考资源

  1. CodeQL分析Fastjson JNDI gadget
  2. Fastjson学习资源
  3. KCon 2022资料
  4. Fastjson黑名单项目
Fastjson漏洞分析与利用全面指南 1. Fastjson简介 Fastjson是阿里巴巴开源的一个Java库,用于: 将Java对象转换为JSON表示形式 将JSON字符串转换为等效的Java对象 处理任意Java对象,包括没有源代码的预先存在的对象 核心功能示例: 2. JSON框架识别技术 不同JSON框架的识别特征 Jackson : 严格要求与bean对象对齐(可少不可多) 无法解析单引号 无法识别注释符 Gson : 浮点数无法转整数(会报错) 遇到#会当作注释符处理 拼接JSON字符串时会报错 org.json : 插入\n、\r等字符会改变输出 结合#注释符处理 Fastjson : 浮点精度不丢失 对@type做出特定响应 可通过DNSLOG探测 Fastjson探测方法 DNSLOG探测 : 高效的无回显探测方法 适用于出网环境 示例payload: {"@type":"java.net.Inet4Address","val":"dnslog.domain"} 响应状态探测 : 观察对@type的响应行为 特定错误信息特征 3. Fastjson版本探测 有回显情况 通过构造特定payload触发报错显示版本号 示例:破坏FastJsonHttpMessageConverter的既定结构 无回显DNSLOG探测 关键版本识别标志: 1.2.47 1.2.68 1.2.80 使用不同类进行探测: java.lang.Class java.lang.AutoCloseable java.lang.Exception 版本特征: 1.2.68和1.2.80只会接收到第一个DNSLOG请求 1.2.83会收到第二个请求 4. 利用链探测技术 Character报错回显 : 当类存在时将Class强转为Char导致报错 可用于确认类是否存在 Class回显 : 类存在时返回类实例 体现在服务器响应变化 DNSLOG外带 : 高难度利用方式 对操作系统和DNS服务器有要求 5. Fastjson漏洞历史与利用 漏洞版本时间线 <=1.2.24 : 最初漏洞版本,无任何校验 任意反序列化利用 常用payload: JdbcRowSetImpl TemplatesImpl bcel 1.2.25-1.2.45 : 引入checkAutoType机制和黑名单 手动开启autotype时可绕过黑名单 <=1.2.47 : 缓存通杀漏洞 不开启AutoTypeSupport也可构造任意反序列化 对于1.2.25-1.2.32需关闭AutoTypeSupport <=1.2.68 : 新增expectClass判断 可通过expectClass绕过autoType检查 <=1.2.80 : expectClass属性引入导致新漏洞 checkAutoType中对expectClass的判断问题 绕过技术演进 1.2.41 : 加L绕过(如 @type":"Lcom.sun.rowset.JdbcRowSetImpl; ) 1.2.42 : 双写L绕过(如 LLcom.sun.rowset.JdbcRowSetImpl;; ) 1.2.43 : 加 [ {绕过(如 {"@type":"[com.sun.rowset.JdbcRowSetImpl"[{...} ) 6. WAF绕过技术 编码绕过 : Fastjson自动进行hex解码和unicode解码 示例:使用编码后的key/value 字符填充 : 传统WAF绕过思路 大量无用字符填充 DOS漏洞 : Fastjson 1.2.36-1.2.62存在DOS漏洞 1.2.80后推出noAutoType版本但未修复DOS漏洞 7. 高级利用技术 Fastjson -> CodeQL分析 可用于寻找调用链 示例:寻找Shiro调用链 source点:类的Field sink点:lookup方法 已发现3条调用链 黑名单分析 Fastjson采用黑名单防御机制 黑名单项目参考:https://github.com/LeadroyaL/fastjson-blacklist 黑名单机制存在固有缺陷,建议使用Fastjson2 8. 防御建议 升级到Fastjson2 禁用AutoType功能 严格过滤输入 使用最新安全版本 监控异常DNS请求 9. 参考资源 CodeQL分析Fastjson JNDI gadget Fastjson学习资源 KCon 2022资料 Fastjson黑名单项目