【缺陷周话】第21期:数据库访问控制
字数 1289 2025-08-18 11:37:57

数据库访问控制漏洞分析与防护指南

1. 数据库访问控制漏洞概述

数据库访问控制漏洞是指程序未进行恰当的访问控制,执行了包含用户控制主键的SQL语句。由于服务器端对客户端数据操作请求过分信任,忽略了对用户操作权限的判定,导致攻击者通过修改参数就可以获得其他账户的增、删、查、改功能。

CWE分类:CWE ID 566 - Authorization Bypass Through User-Controlled SQL Primary Key

2. 漏洞危害

  • 允许攻击者访问同级别用户的资源
  • 可能访问更高级别用户的资源
  • 导致任意用户敏感信息泄露
  • 用户信息可能被恶意修改或删除
  • 类似于数据库越权攻击,具有高度隐秘性

典型场景:通过遍历用户ID参数,可以查看所有用户的敏感信息(如登录名、密码、手机号、身份证等),形成变相"脱库"攻击。

3. 漏洞示例分析

3.1 缺陷代码示例

// 示例来源于Samate Juliet Test Suite for Java v1.3
// 文件: CWE566_Authorization_Bypass_Through_SQL_Primary__Servlet_01.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String id = request.getParameter("id"); // 获取用户输入的id参数
    int intID = Integer.parseInt(id);      // 转换为整数
    
    try {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "user", "password");
        Statement statement = conn.createStatement();
        // 直接使用用户控制的id构造SQL查询
        ResultSet rs = statement.executeQuery("SELECT * FROM items WHERE uid=" + intID);
        
        while (rs.next()) {
            // 处理查询结果...
        }
    } catch (SQLException e) {
        // 异常处理...
    }
}

漏洞点分析

  1. 直接从用户请求中获取id参数(第31行)
  2. 未对用户权限进行验证(缺失权限检查)
  3. 直接将用户控制的参数拼接到SQL语句中(第53行)
  4. 允许用户通过修改id参数访问其他用户数据

3.2 检测工具发现

使用360代码卫士检测工具可以识别此类漏洞:

  • 检测等级:中
  • 能够追踪污染源和数据流向
  • 明确标识出存在漏洞的代码行

4. 修复方案

4.1 修复代码示例

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 从session中获取已认证的用户ID,而非用户输入
    String id = (String) request.getSession().getAttribute("userid");
    int intID = Integer.parseInt(id);
    
    try {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "user", "password");
        Statement statement = conn.createStatement();
        // 使用session中的用户ID构造查询
        ResultSet rs = statement.executeQuery("SELECT * FROM items WHERE uid=" + intID);
        
        while (rs.next()) {
            // 处理查询结果...
        }
    } catch (SQLException e) {
        // 异常处理...
    }
}

修复要点

  1. 从可信源(session)获取用户ID(第34行)
  2. 不再依赖用户输入的主键值
  3. 确保查询只能访问当前用户的数据

4.2 修复验证

使用360代码卫士对修复后的代码进行检测,确认"数据库访问控制"缺陷已消除。

5. 防护措施

5.1 完善用户权限体系

  • 明确数据与用户的对应关系
  • 定义哪些数据不应由哪些用户操作
  • 实现细粒度的访问控制策略

5.2 服务端权限验证

  • 对请求数据和当前用户身份做校验
  • 使用权限参数判断用户操作权限
  • 实现基于角色的访问控制(RBAC)
  • 考虑属性基访问控制(ABAC)模型

5.3 输入参数处理

  • 对可控参数进行严格检查与过滤
  • 使用白名单验证参数值
  • 实施参数绑定或预处理语句
  • 避免直接拼接用户输入到SQL中

5.4 其他防护建议

  1. 最小权限原则:数据库账户应仅具有必要的最小权限
  2. 日志记录:记录敏感数据访问操作
  3. 数据脱敏:返回敏感数据时进行适当脱敏处理
  4. API设计:RESTful API应验证资源所有权
  5. 安全测试:定期进行渗透测试和代码审计

6. 相关漏洞类型

  1. 水平越权:访问同级别用户资源
  2. 垂直越权:访问更高级别用户资源
  3. IDOR (Insecure Direct Object Reference):不安全的直接对象引用
  4. 权限提升:通过漏洞获得更高权限

7. 开发实践建议

  1. 框架使用:利用成熟安全框架(如Spring Security)处理授权
  2. 设计模式:实现门面模式集中处理权限检查
  3. 代码审查:将权限检查纳入代码审查清单
  4. 安全培训:提高开发人员安全意识
  5. 自动化检测:集成静态分析工具到CI/CD流程

通过实施以上防护措施,可以有效预防数据库访问控制漏洞,保护系统数据安全。

数据库访问控制漏洞分析与防护指南 1. 数据库访问控制漏洞概述 数据库访问控制漏洞是指程序未进行恰当的访问控制,执行了包含用户控制主键的SQL语句。由于服务器端对客户端数据操作请求过分信任,忽略了对用户操作权限的判定,导致攻击者通过修改参数就可以获得其他账户的增、删、查、改功能。 CWE分类 :CWE ID 566 - Authorization Bypass Through User-Controlled SQL Primary Key 2. 漏洞危害 允许攻击者访问同级别用户的资源 可能访问更高级别用户的资源 导致任意用户敏感信息泄露 用户信息可能被恶意修改或删除 类似于数据库越权攻击,具有高度隐秘性 典型场景 :通过遍历用户ID参数,可以查看所有用户的敏感信息(如登录名、密码、手机号、身份证等),形成变相"脱库"攻击。 3. 漏洞示例分析 3.1 缺陷代码示例 漏洞点分析 : 直接从用户请求中获取id参数(第31行) 未对用户权限进行验证(缺失权限检查) 直接将用户控制的参数拼接到SQL语句中(第53行) 允许用户通过修改id参数访问其他用户数据 3.2 检测工具发现 使用360代码卫士检测工具可以识别此类漏洞: 检测等级:中 能够追踪污染源和数据流向 明确标识出存在漏洞的代码行 4. 修复方案 4.1 修复代码示例 修复要点 : 从可信源(session)获取用户ID(第34行) 不再依赖用户输入的主键值 确保查询只能访问当前用户的数据 4.2 修复验证 使用360代码卫士对修复后的代码进行检测,确认"数据库访问控制"缺陷已消除。 5. 防护措施 5.1 完善用户权限体系 明确数据与用户的对应关系 定义哪些数据不应由哪些用户操作 实现细粒度的访问控制策略 5.2 服务端权限验证 对请求数据和当前用户身份做校验 使用权限参数判断用户操作权限 实现基于角色的访问控制(RBAC) 考虑属性基访问控制(ABAC)模型 5.3 输入参数处理 对可控参数进行严格检查与过滤 使用白名单验证参数值 实施参数绑定或预处理语句 避免直接拼接用户输入到SQL中 5.4 其他防护建议 最小权限原则 :数据库账户应仅具有必要的最小权限 日志记录 :记录敏感数据访问操作 数据脱敏 :返回敏感数据时进行适当脱敏处理 API设计 :RESTful API应验证资源所有权 安全测试 :定期进行渗透测试和代码审计 6. 相关漏洞类型 水平越权 :访问同级别用户资源 垂直越权 :访问更高级别用户资源 IDOR (Insecure Direct Object Reference):不安全的直接对象引用 权限提升 :通过漏洞获得更高权限 7. 开发实践建议 框架使用 :利用成熟安全框架(如Spring Security)处理授权 设计模式 :实现门面模式集中处理权限检查 代码审查 :将权限检查纳入代码审查清单 安全培训 :提高开发人员安全意识 自动化检测 :集成静态分析工具到CI/CD流程 通过实施以上防护措施,可以有效预防数据库访问控制漏洞,保护系统数据安全。