【缺陷周话】第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) {
// 异常处理...
}
}
漏洞点分析:
- 直接从用户请求中获取id参数(第31行)
- 未对用户权限进行验证(缺失权限检查)
- 直接将用户控制的参数拼接到SQL语句中(第53行)
- 允许用户通过修改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) {
// 异常处理...
}
}
修复要点:
- 从可信源(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流程
通过实施以上防护措施,可以有效预防数据库访问控制漏洞,保护系统数据安全。