fastjson 原生配合 jdk 原生的利用总结
字数 1905 2025-08-22 12:23:30

Fastjson原生配合JDK原生利用链深度分析与总结

1. Fastjson原生利用机制分析

1.1 Fastjson基础触发原理

Fastjson在序列化对象时会自动调用对象的getter方法,这是其核心利用点。关键调用链如下:

toJSONString() -> write() -> ASM序列化引擎 -> 调用getter方法

调试分析要点:

  • 通过toJSONString方法触发序列化过程
  • 关键点在于writer.write方法中的ASM序列化引擎
  • ASM引擎会自动扫描并调用目标对象的所有getter方法

1.2 触发点分析

在实际利用中,触发toJSONString的方式:

  • 直接调用JSON.toJSONString()
  • 调用toString()方法(因为Fastjson的JSONObject/JSONArraytoString内部会调用toJSONString
  • 其他隐式序列化场景

2. JDK原生类利用链分析

2.1 TemplatesImpl利用链

利用原理

  • 利用com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
  • 关键触发方法:getOutputProperties()(getter方法)

利用步骤

  1. 构造恶意的TemplatesImpl对象,包含字节码
  2. Fastjson序列化时会调用getOutputProperties()
  3. 触发字节码加载和执行

调试关键点

  • 关注getOutputProperties()调用栈
  • 观察ASM如何自动触发getter方法
  • 验证恶意字节码是否被成功加载

2.2 LdapAttribute利用链

利用原理

  • 利用com.sun.jndi.ldap.LdapAttribute
  • 关键触发方法:getAttributeDefinition()
  • 本质上是JNDI注入的变种利用

调用链分析

getAttributeDefinition() -> getSchema() -> p_getSchema() -> p_resolveIntermediate() -> c_resolveIntermediate_nns() -> c_lookup()

关键调试步骤

  1. 观察getSchema()如何处理RDN解析
  2. 分析p_resolveIntermediate方法:
    • 将输入分为头和尾两部分
    • 传入c_resolveIntermediate_nns方法
  3. 最终在c_lookup方法中实现JNDI查找

2.3 SignedObject利用链

利用原理

  • 利用java.security.SignedObject
  • 关键触发方法:getObject()
  • 该方法可实现二次反序列化

利用特点

  • 需要控制content字段的值(包含二次反序列化内容)
  • 可与其他反序列化链结合形成攻击链

调试要点

  • 验证getObject()方法是否被成功调用
  • 观察二次反序列化的触发过程
  • 检查content字段的构造方式

3. 组合利用实践

3.1 典型POC构造要点

  1. TemplatesImpl链

    • 构造包含恶意字节码的TemplatesImpl对象
    • 确保Fastjson版本存在自动调用getter的漏洞
  2. LdapAttribute链

    • 构造恶意的LDAP引用
    • 利用getAttributeDefinition触发JNDI查找
  3. SignedObject链

    • 构造包含二次反序列化数据的SignedObject对象
    • 确保getObject()被调用时触发后续链

3.2 防御绕过技巧

  1. 使用JDK原生类绕过黑名单检测
  2. 利用非常规getter方法(如getAttributeDefinition
  3. 多层嵌套利用(如SignedObject的二次反序列化)

4. 防御建议

  1. Fastjson加固

    • 升级到最新安全版本
    • 启用SafeMode
    • 自定义反序列化过滤器
  2. JDK层面防御

    • 限制JNDI查找
    • 监控可疑的类加载行为
    • 禁用不必要的Java特性
  3. 运行时防护

    • 使用RASP解决方案
    • 实施严格的输入验证
    • 监控异常序列化行为

5. 深入调试技巧

  1. 使用IDEA调试Fastjson源码:

    • 重点关注ASM序列化部分
    • 跟踪getter方法调用栈
  2. JDK源码调试:

    • 下载对应版本的JDK源码
    • 重点关注LdapAttributeTemplatesImpl等关键类
  3. 动态分析工具:

    • 使用Java Agent技术监控方法调用
    • 结合字节码分析工具观察恶意类加载

6. 扩展研究方向

  1. 其他JDK原生类的潜在利用链
  2. Fastjson不同版本间的差异利用
  3. 结合新型攻击技术(如EL表达式注入)
  4. 跨中间件的联合利用研究

通过深入理解Fastjson与JDK原生类的交互机制,安全研究人员可以更全面地评估Fastjson使用的风险,并开发更有效的防御策略。

Fastjson原生配合JDK原生利用链深度分析与总结 1. Fastjson原生利用机制分析 1.1 Fastjson基础触发原理 Fastjson在序列化对象时会自动调用对象的getter方法,这是其核心利用点。关键调用链如下: 调试分析要点: 通过 toJSONString 方法触发序列化过程 关键点在于 writer.write 方法中的ASM序列化引擎 ASM引擎会自动扫描并调用目标对象的所有getter方法 1.2 触发点分析 在实际利用中,触发 toJSONString 的方式: 直接调用 JSON.toJSONString() 调用 toString() 方法(因为Fastjson的 JSONObject / JSONArray 的 toString 内部会调用 toJSONString ) 其他隐式序列化场景 2. JDK原生类利用链分析 2.1 TemplatesImpl利用链 利用原理 : 利用 com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl 类 关键触发方法: getOutputProperties() (getter方法) 利用步骤 : 构造恶意的TemplatesImpl对象,包含字节码 Fastjson序列化时会调用 getOutputProperties() 触发字节码加载和执行 调试关键点 : 关注 getOutputProperties() 调用栈 观察ASM如何自动触发getter方法 验证恶意字节码是否被成功加载 2.2 LdapAttribute利用链 利用原理 : 利用 com.sun.jndi.ldap.LdapAttribute 类 关键触发方法: getAttributeDefinition() 本质上是JNDI注入的变种利用 调用链分析 : 关键调试步骤 : 观察 getSchema() 如何处理RDN解析 分析 p_resolveIntermediate 方法: 将输入分为头和尾两部分 传入 c_resolveIntermediate_nns 方法 最终在 c_lookup 方法中实现JNDI查找 2.3 SignedObject利用链 利用原理 : 利用 java.security.SignedObject 类 关键触发方法: getObject() 该方法可实现二次反序列化 利用特点 : 需要控制 content 字段的值(包含二次反序列化内容) 可与其他反序列化链结合形成攻击链 调试要点 : 验证 getObject() 方法是否被成功调用 观察二次反序列化的触发过程 检查 content 字段的构造方式 3. 组合利用实践 3.1 典型POC构造要点 TemplatesImpl链 : 构造包含恶意字节码的TemplatesImpl对象 确保Fastjson版本存在自动调用getter的漏洞 LdapAttribute链 : 构造恶意的LDAP引用 利用 getAttributeDefinition 触发JNDI查找 SignedObject链 : 构造包含二次反序列化数据的SignedObject对象 确保 getObject() 被调用时触发后续链 3.2 防御绕过技巧 使用JDK原生类绕过黑名单检测 利用非常规getter方法(如 getAttributeDefinition ) 多层嵌套利用(如SignedObject的二次反序列化) 4. 防御建议 Fastjson加固 : 升级到最新安全版本 启用SafeMode 自定义反序列化过滤器 JDK层面防御 : 限制JNDI查找 监控可疑的类加载行为 禁用不必要的Java特性 运行时防护 : 使用RASP解决方案 实施严格的输入验证 监控异常序列化行为 5. 深入调试技巧 使用IDEA调试Fastjson源码: 重点关注ASM序列化部分 跟踪getter方法调用栈 JDK源码调试: 下载对应版本的JDK源码 重点关注 LdapAttribute 、 TemplatesImpl 等关键类 动态分析工具: 使用Java Agent技术监控方法调用 结合字节码分析工具观察恶意类加载 6. 扩展研究方向 其他JDK原生类的潜在利用链 Fastjson不同版本间的差异利用 结合新型攻击技术(如EL表达式注入) 跨中间件的联合利用研究 通过深入理解Fastjson与JDK原生类的交互机制,安全研究人员可以更全面地评估Fastjson使用的风险,并开发更有效的防御策略。