看一名Java开发人员以红队思维五分钟审计一套代码(续)
字数 1112 2025-08-15 21:32:24

Java代码审计:越权漏洞详解与防御

一、越权漏洞概述

越权漏洞是Java Web应用程序中最常见的安全问题之一,可分为两类:

  • 水平越权:同权限用户之间可以访问或操作彼此的数据(占JavaWeb漏洞的80%)
  • 垂直越权:低权限用户可以访问或操作高权限用户的功能

二、水平越权详解

典型场景:删除功能

删除功能是水平越权的"重灾区",常见问题模式:

  1. 漏洞产生原因

    • 前端传递ID给后端
    • 后端直接根据ID删除数据
    • 未验证该ID是否属于当前登录用户
  2. 漏洞代码示例

// 问题代码:直接根据前端传来的id删除,不做归属验证
public void deleteRecord(String id) {
    recordDao.deleteById(id);
}
  1. 攻击方式
    • 攻击者篡改ID值为其他用户的记录ID
    • 可编写脚本循环递增ID进行批量删除(潜在"删库"风险)

防御方案

  1. ID生成策略改进

    • 避免使用自增ID(1,2,3...)
    • 采用雪花算法生成不可预测的ID
    // 雪花算法ID生成示例
    public class SnowflakeIdWorker {
        public synchronized long nextId() {
            // 实现略...
        }
    }
    
  2. 强制归属验证

    • 后端必须验证数据归属
    • 增加一条SQL查询验证记录是否属于当前用户
    // 修复代码:验证记录归属
    public void deleteRecord(String id, String currentUserId) {
        Record record = recordDao.findById(id);
        if(record != null && record.getUserId().equals(currentUserId)) {
            recordDao.deleteById(id);
        }
    }
    
  3. 开发原则

    • 零信任原则:不信任任何前端传入的参数
    • 性能与安全的平衡:必要的验证不可省略

三、垂直越权详解

典型特征

  • 完全依赖前端界面控制权限显示
  • 高权限功能接口未在后端做权限验证

攻击方式

  1. 拥有高权限和低权限两个账号
  2. 用低权限账号直接调用高权限接口

防御方案

  1. 后端必须做权限验证
    • 不能仅依赖前端隐藏或禁用功能
  2. 使用成熟权限框架
    • Apache Shiro
    • Spring Security
    • 注意:Shiro本身也有历史漏洞需关注

四、漏洞危害评估

  1. 水平越权

    • 常被低估为"低危"
    • 实际危害:可导致大规模数据泄露或破坏
    • 自动化攻击可造成"删库"等严重后果
  2. 垂直越权

    • 通常反映开发人员态度问题而非技术问题
    • 可直接获取系统高权限功能

五、审计要点总结

  1. 重点关注功能

    • 数据删除操作
    • 数据修改操作
    • 敏感信息查看接口
  2. 验证每个涉及用户数据的操作

    • 是否验证了当前用户与数据的关系
    • 是否验证了用户角色权限
  3. 测试方法

    • 水平越权:使用同一级别不同账号测试数据访问
    • 垂直越权:使用低权限账号测试高权限接口

六、开发安全规范

  1. 必须遵守的原则

    • 所有用户输入都不可信
    • 所有数据操作必须验证归属和权限
    • 权限验证必须在后端实现
  2. 代码审查重点

    • 检查所有DAO层操作是否有前置验证
    • 检查Controller层是否直接使用前端参数
  3. 性能考量

    • 必要的安全验证不可因性能考虑而省略
    • 可通过缓存等方式优化验证性能

七、后续学习建议

  1. 进阶方向

    • Java逻辑漏洞审计
    • 需要具备Java开发基础
  2. 学习路径

    • 掌握Java Web开发基础
    • 学习常见安全框架使用
    • 研究OWASP Top 10漏洞原理
  3. 实践建议

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