看一名Java开发人员以红队思维五分钟审计一套代码(续)
字数 1112 2025-08-15 21:32:24
Java代码审计:越权漏洞详解与防御
一、越权漏洞概述
越权漏洞是Java Web应用程序中最常见的安全问题之一,可分为两类:
- 水平越权:同权限用户之间可以访问或操作彼此的数据(占JavaWeb漏洞的80%)
- 垂直越权:低权限用户可以访问或操作高权限用户的功能
二、水平越权详解
典型场景:删除功能
删除功能是水平越权的"重灾区",常见问题模式:
-
漏洞产生原因:
- 前端传递ID给后端
- 后端直接根据ID删除数据
- 未验证该ID是否属于当前登录用户
-
漏洞代码示例:
// 问题代码:直接根据前端传来的id删除,不做归属验证
public void deleteRecord(String id) {
recordDao.deleteById(id);
}
- 攻击方式:
- 攻击者篡改ID值为其他用户的记录ID
- 可编写脚本循环递增ID进行批量删除(潜在"删库"风险)
防御方案
-
ID生成策略改进:
- 避免使用自增ID(1,2,3...)
- 采用雪花算法生成不可预测的ID
// 雪花算法ID生成示例 public class SnowflakeIdWorker { public synchronized long nextId() { // 实现略... } } -
强制归属验证:
- 后端必须验证数据归属
- 增加一条SQL查询验证记录是否属于当前用户
// 修复代码:验证记录归属 public void deleteRecord(String id, String currentUserId) { Record record = recordDao.findById(id); if(record != null && record.getUserId().equals(currentUserId)) { recordDao.deleteById(id); } } -
开发原则:
- 零信任原则:不信任任何前端传入的参数
- 性能与安全的平衡:必要的验证不可省略
三、垂直越权详解
典型特征
- 完全依赖前端界面控制权限显示
- 高权限功能接口未在后端做权限验证
攻击方式
- 拥有高权限和低权限两个账号
- 用低权限账号直接调用高权限接口
防御方案
- 后端必须做权限验证
- 不能仅依赖前端隐藏或禁用功能
- 使用成熟权限框架:
- Apache Shiro
- Spring Security
- 注意:Shiro本身也有历史漏洞需关注
四、漏洞危害评估
-
水平越权:
- 常被低估为"低危"
- 实际危害:可导致大规模数据泄露或破坏
- 自动化攻击可造成"删库"等严重后果
-
垂直越权:
- 通常反映开发人员态度问题而非技术问题
- 可直接获取系统高权限功能
五、审计要点总结
-
重点关注功能:
- 数据删除操作
- 数据修改操作
- 敏感信息查看接口
-
验证每个涉及用户数据的操作:
- 是否验证了当前用户与数据的关系
- 是否验证了用户角色权限
-
测试方法:
- 水平越权:使用同一级别不同账号测试数据访问
- 垂直越权:使用低权限账号测试高权限接口
六、开发安全规范
-
必须遵守的原则:
- 所有用户输入都不可信
- 所有数据操作必须验证归属和权限
- 权限验证必须在后端实现
-
代码审查重点:
- 检查所有DAO层操作是否有前置验证
- 检查Controller层是否直接使用前端参数
-
性能考量:
- 必要的安全验证不可因性能考虑而省略
- 可通过缓存等方式优化验证性能
七、后续学习建议
-
进阶方向:
- Java逻辑漏洞审计
- 需要具备Java开发基础
-
学习路径:
- 掌握Java Web开发基础
- 学习常见安全框架使用
- 研究OWASP Top 10漏洞原理
-
实践建议:
- 漏洞测试时使用自建账号
- 切勿在生产环境进行破坏性测试