漏洞概述 JeecgBoot 的 SysUser 实体中 userIdentity 字段控制用户的数据可见范围。该字段本应仅通过“部门负责人设置”流程由系统内部修改,但 POST /sys/user/login/setting/userEdit 接口存在授权漏洞:直接绑定完整 SysUser 实体,通过 updatedBy() 持久化请求体,未对 userIdentity 做必要检查或白名单过滤。该漏洞被 @RequiredPermissions("system:user:setting:edit") 保护,但此权限被分配给了 test 角色(系统用户标配角色),所有注册用户默认拥有。 影响范围 所有注册用户 通过修改 userIdentity 字段,可以改变数据可见范围,实现权限提升 修复方案 1. 权限校验:在更新 userIdentity 时,增加权限校验,确保只有特定角色或用户才能修改。 2. 白名单过滤:对 userIdentity 字段进行白名单过滤,只允许特定的值。 3. 代码示例: POC 复现步骤 1. 使用两个用户账号进行演示: - 参照用户:supervisor (userIdentity=2, departIds=财务部, 仅 test 角色) - 攻击者:testonly (userIdentity=1, departIds=空, 仅 test 角色) - 两个用户同属“财务部”(a7d7e7e6dc84325a40932163acdaa6) 2. 攻击前:权限对比 - 以 supervisor(主管)登录,调用 departUserList: Response (4 条记录): - 以 testonly(下属)登录,调用同一端点: Response (0 条记录): 3. 攻击:Mass Assignment 自我升级 Response: 4. 攻击后:重新登录并验证 - 重新登录(刷新 Shiro 缓存中的 LoginUser,使其携带新的 userIdentity=2 和 departIds),再次调用 departUserList: Response (4 条记录): 5. 攻击前后对比 - supervisor: 4 条记录 (jeecg, zhangsan, supervisor, testonly) - testonly: 0 条记录 (攻击前) - testonly: 4 条记录 (攻击后) 攻击后,testonly 能看到与主管完全相同的部门成员列表,权限提升成功。