VNCTF java 题目调用链分析
字数 1791 2025-08-22 12:23:24

VNCTF Java反序列化题目调用链分析教学文档

一、题目概述

这是一个Java反序列化漏洞利用的CTF题目,主要考察反序列化调用链的构造和绕过WAF的技巧。题目使用了多层反序列化调用链,结合了JDK原生类和Fastjson的漏洞利用方式。

二、环境分析

1. 依赖分析

  • 题目使用了较少的依赖
  • 主要关注点是JDK原生类和Fastjson

2. 关键类分析

  • 反序列化入口类
  • WAF类(位于特定包名下)
  • 出口类(用于最终执行恶意代码)

3. WAF限制

  • 禁用了Jackson的利用链
  • 需要寻找其他可利用的链

三、主要利用链分析

1. 主调用链结构

EventListenerList.readObject()
    -> UndoManager.toString()
        -> Vector.toString()
            -> Fastjson原生触发
                -> 二次反序列化
                    -> BadAttributeValueException
                        -> 出口类.getOutputProperties()
                            -> 字节码加载

2. 详细调用过程

第一阶段:初始反序列化

  1. EventListenerList.readObject()

    • JDK原生类javax.swing.event.EventListenerListreadObject方法
    • 会调用add方法将反序列化的对象添加到监听器列表
  2. UndoManager.toString()触发

    • add方法中将javax.swing.undo.UndoManager对象与字符串拼接
    • 这会触发UndoManagertoString()方法
  3. Vector.toString()调用

    • UndoManager.toString()会调用到java.util.VectortoString方法
    • Vector.toString()会调用父类的AbstractCollection.toString()
  4. Fastjson原生触发

    • AbstractCollection.toString()中会调用append方法
    • 进而调用String.valueOf(obj),触发obj的toString方法
    • 控制obj为JSONArray对象,触发Fastjson的原生漏洞

第二阶段:Fastjson原生利用

  1. Fastjson触发机制

    • Fastjson原生漏洞会触发类的getter方法
    • 需要构造一个能触发二次反序列化的场景
  2. SignedObject利用

    • 控制JSONArray中包含SignedObject对象
    • SignedObject.getObject()方法会执行二次反序列化
    • 可以绕过WAF对第一次反序列化的限制

第三阶段:二次反序列化

  1. BadAttributeValueException利用

    • 在二次反序列化中使用BadAttributeValueException
    • 这是Java反序列化中常用的触发toString的老朋友
    • 可以触发出口类的getOutputProperties方法
  2. 最终执行

    • 通过getOutputProperties触发字节码加载
    • 实现任意代码执行

四、其他可能的利用链

1. JNDI攻击面

  • 使用LdapAttribute(JDK原生类)
  • 构造LDAP引用攻击
  • 需要注意JDK版本限制

利用步骤:

  1. 自建恶意LDAP服务
  2. 构造LdapAttribute对象指向恶意服务
  3. 触发JNDI查找

2. Jackson原生利用

  • 如果WAF没有完全禁用Jackson
  • 可以通过二次反序列化触发Jackson漏洞

POC结构:

第一次反序列化(绕过WAF)
    -> 触发二次反序列化
        -> Jackson原生链
            -> 任意代码执行

五、关键知识点总结

  1. 多阶段反序列化

    • 通过第一次反序列化触发第二次反序列化
    • 绕过WAF对第一次反序列化的限制
  2. toString触发点

    • 利用对象与字符串拼接、集合toString等方法
    • 触发关键类的toString方法
  3. Fastjson原生利用

    • 通过控制JSONArray触发Fastjson漏洞
    • 利用getter方法执行链
  4. SignedObject绕过

    • 利用SignedObject进行二次反序列化
    • 绕过对直接反序列化的限制
  5. 出口类利用

    • 最终需要通过某个类的特定方法执行代码
    • 通常使用能触发字节码加载或命令执行的类

六、防御建议

  1. 反序列化防御

    • 使用白名单控制可反序列化的类
    • 避免直接反序列化不可信数据
  2. WAF增强

    • 不仅要检查第一次反序列化,还要防范二次反序列化
    • 禁止关键危险类如SignedObject
  3. 依赖管理

    • 及时更新Fastjson等有漏洞的组件
    • 移除不必要的依赖
  4. JNDI防护

    • 限制JNDI查找
    • 升级JDK版本
  5. 运行时保护

    • 使用SecurityManager限制敏感操作
    • 监控异常行为
VNCTF Java反序列化题目调用链分析教学文档 一、题目概述 这是一个Java反序列化漏洞利用的CTF题目,主要考察反序列化调用链的构造和绕过WAF的技巧。题目使用了多层反序列化调用链,结合了JDK原生类和Fastjson的漏洞利用方式。 二、环境分析 1. 依赖分析 题目使用了较少的依赖 主要关注点是JDK原生类和Fastjson 2. 关键类分析 反序列化入口类 WAF类(位于特定包名下) 出口类(用于最终执行恶意代码) 3. WAF限制 禁用了Jackson的利用链 需要寻找其他可利用的链 三、主要利用链分析 1. 主调用链结构 2. 详细调用过程 第一阶段:初始反序列化 EventListenerList.readObject() JDK原生类 javax.swing.event.EventListenerList 的 readObject 方法 会调用 add 方法将反序列化的对象添加到监听器列表 UndoManager.toString()触发 add 方法中将 javax.swing.undo.UndoManager 对象与字符串拼接 这会触发 UndoManager 的 toString() 方法 Vector.toString()调用 UndoManager.toString() 会调用到 java.util.Vector 的 toString 方法 Vector.toString() 会调用父类的 AbstractCollection.toString() Fastjson原生触发 在 AbstractCollection.toString() 中会调用 append 方法 进而调用 String.valueOf(obj) ,触发obj的 toString 方法 控制obj为 JSONArray 对象,触发Fastjson的原生漏洞 第二阶段:Fastjson原生利用 Fastjson触发机制 Fastjson原生漏洞会触发类的getter方法 需要构造一个能触发二次反序列化的场景 SignedObject利用 控制 JSONArray 中包含 SignedObject 对象 SignedObject.getObject() 方法会执行二次反序列化 可以绕过WAF对第一次反序列化的限制 第三阶段:二次反序列化 BadAttributeValueException利用 在二次反序列化中使用 BadAttributeValueException 这是Java反序列化中常用的触发 toString 的老朋友 可以触发出口类的 getOutputProperties 方法 最终执行 通过 getOutputProperties 触发字节码加载 实现任意代码执行 四、其他可能的利用链 1. JNDI攻击面 使用 LdapAttribute (JDK原生类) 构造LDAP引用攻击 需要注意JDK版本限制 利用步骤: 自建恶意LDAP服务 构造 LdapAttribute 对象指向恶意服务 触发JNDI查找 2. Jackson原生利用 如果WAF没有完全禁用Jackson 可以通过二次反序列化触发Jackson漏洞 POC结构: 五、关键知识点总结 多阶段反序列化 通过第一次反序列化触发第二次反序列化 绕过WAF对第一次反序列化的限制 toString触发点 利用对象与字符串拼接、集合toString等方法 触发关键类的toString方法 Fastjson原生利用 通过控制JSONArray触发Fastjson漏洞 利用getter方法执行链 SignedObject绕过 利用SignedObject进行二次反序列化 绕过对直接反序列化的限制 出口类利用 最终需要通过某个类的特定方法执行代码 通常使用能触发字节码加载或命令执行的类 六、防御建议 反序列化防御 使用白名单控制可反序列化的类 避免直接反序列化不可信数据 WAF增强 不仅要检查第一次反序列化,还要防范二次反序列化 禁止关键危险类如SignedObject 依赖管理 及时更新Fastjson等有漏洞的组件 移除不必要的依赖 JNDI防护 限制JNDI查找 升级JDK版本 运行时保护 使用SecurityManager限制敏感操作 监控异常行为