vnctf2025 javaGuide+Gin
字数 1484 2025-08-29 08:30:24

FastJSON高版本反序列化漏洞利用与Gin框架审计实战

一、FastJSON高版本反序列化漏洞利用

1. 环境与限制条件

  • Spring Boot 2.7 + FastJSON 1.2.83
  • 黑名单过滤:
    • com.sun.org.apache.xalan.internal.xsltc.trax
    • javax.management
    • com.fasterxml.jackson
  • 过滤效果:
    • 阻断TemplatesImplBadAttributeValueExpException利用
    • 阻断Jackson相关的toString方法利用类

2. 绕过思路分析

2.1 引用类型绕过

核心思路是利用黑名单中的引用(reference)类型绕过resolveClass检查:

  • 通过HotSwappableTargetSource + XString组合替代BadAttributeValueExpException触发toString

2.2 二次反序列化绕过

当直接绕过TemplatesImpl受限时,可采用SignedObject进行二次反序列化:

  • SignedObject.getObject()方法会再次执行反序列化操作
  • 构造方法第一个参数传入恶意类

3. 完整利用链构造

hashMap2.readObject
-> eventListenerList.readObject
-> UndoManager.toString
-> Vector.toString
-> JSONArray1.toString
-> SignedObject.getObject
-> hashMap1.readObject
-> XString.equals
-> JSONArray.toString
-> TemplatesImpl.getOutputProperties

4. 关键代码实现

// 使用SignedObject进行二次反序列化
SignedObject signedObject = new SignedObject(恶意对象, null, null);

// 触发链构造
// 使用EventListenerList+UndoManager触发getObject

5. 调试问题解决

  • SignedObject本地调试报错default constructor not found解决方案:
    • 确保正确初始化参数
    • 检查类路径和依赖版本

二、Gin框架代码审计实战

1. 目录穿越漏洞

  • 发现未过滤的下载接口:
    /download?filename=./config/key.go
    
  • 通过路径遍历读取敏感文件:
    http://node.vnteam.cn:47191/download?filename=./config/key.go
    

2. JWT密钥泄露

  • 从泄露的key.go中提取JWT密钥:122r00t32l
  • 使用jwt.io修改token实现越权

3. 代码执行审计

  • 发现存在代码执行功能
  • 过滤缺陷:仅过滤单行import语句
  • 绕过方法:使用多行import或注释绕过

4. 提权利用

  1. 查找SUID程序:

    find / -user root -perm /4000 2>/dev/null
    

    发现可疑程序:/.../Cat

  2. 环境变量劫持:

    # 创建恶意cat
    echo -e '#!/bin/bash\n/bin/bash' > /tmp/cat
    chmod +x /tmp/cat
    
    # 修改PATH
    export PATH=/tmp:$PATH
    
    # 执行SUID程序
    /.../Cat
    
  3. 读取flag注意事项:

    • 避免使用被劫持的cat
    • 使用tac或完整路径/bin/cat读取

三、参考资源

  1. FastJSON高版本原生利用:
    https://y4tacker.github.io/2023/04/26/year/2023/4/FastJson%E4%B8%8E%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-%E4%BA%8C/#%E5%AE%8C%E6%95%B4%E5%88%A9%E7%94%A8

  2. Java反序列化绕过resolveClass:
    https://dummykitty.github.io/java/2023/07/24/Java-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%95%E8%BF%87-resolveClass.html

  3. 先知社区相关文章:

    • https://xz.aliyun.com/news/16045
    • https://xz.aliyun.com/news/12052
    • https://xz.aliyun.com/news/15977

四、防御建议

  1. FastJSON防御:

    • 升级到最新安全版本
    • 实现更严格的反序列化过滤
    • 禁用不必要的反序列化功能
  2. Gin框架防御:

    • 严格校验文件路径
    • 加强JWT密钥保护
    • 完善代码执行过滤规则
    • 避免使用危险函数调用方式
FastJSON高版本反序列化漏洞利用与Gin框架审计实战 一、FastJSON高版本反序列化漏洞利用 1. 环境与限制条件 Spring Boot 2.7 + FastJSON 1.2.83 黑名单过滤: com.sun.org.apache.xalan.internal.xsltc.trax javax.management com.fasterxml.jackson 过滤效果: 阻断 TemplatesImpl 和 BadAttributeValueExpException 利用 阻断Jackson相关的 toString 方法利用类 2. 绕过思路分析 2.1 引用类型绕过 核心思路是利用黑名单中的引用(reference)类型绕过 resolveClass 检查: 通过 HotSwappableTargetSource + XString 组合替代 BadAttributeValueExpException 触发 toString 2.2 二次反序列化绕过 当直接绕过 TemplatesImpl 受限时,可采用 SignedObject 进行二次反序列化: SignedObject.getObject() 方法会再次执行反序列化操作 构造方法第一个参数传入恶意类 3. 完整利用链构造 4. 关键代码实现 5. 调试问题解决 SignedObject 本地调试报错 default constructor not found 解决方案: 确保正确初始化参数 检查类路径和依赖版本 二、Gin框架代码审计实战 1. 目录穿越漏洞 发现未过滤的下载接口: 通过路径遍历读取敏感文件: 2. JWT密钥泄露 从泄露的 key.go 中提取JWT密钥: 122r00t32l 使用 jwt.io 修改token实现越权 3. 代码执行审计 发现存在代码执行功能 过滤缺陷:仅过滤单行 import 语句 绕过方法:使用多行 import 或注释绕过 4. 提权利用 查找SUID程序: 发现可疑程序: /.../Cat 环境变量劫持: 读取flag注意事项: 避免使用被劫持的 cat 使用 tac 或完整路径 /bin/cat 读取 三、参考资源 FastJSON高版本原生利用: https://y4tacker.github.io/2023/04/26/year/2023/4/FastJson%E4%B8%8E%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-%E4%BA%8C/#%E5%AE%8C%E6%95%B4%E5%88%A9%E7%94%A8 Java反序列化绕过resolveClass: https://dummykitty.github.io/java/2023/07/24/Java-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%95%E8%BF%87-resolveClass.html 先知社区相关文章: https://xz.aliyun.com/news/16045 https://xz.aliyun.com/news/12052 https://xz.aliyun.com/news/15977 四、防御建议 FastJSON防御: 升级到最新安全版本 实现更严格的反序列化过滤 禁用不必要的反序列化功能 Gin框架防御: 严格校验文件路径 加强JWT密钥保护 完善代码执行过滤规则 避免使用危险函数调用方式