失效的访问控制 (Broken Access Control)
什么是访问控制?
访问控制(Access Control)也称为授权(Authorization),是确保用户只能访问其被授权资源的安全机制。
形象比喻: 想象你住在一个公寓楼里:
- 身份认证(Authentication): 门禁卡证明你是楼里的住户
- 访问控制(Authorization): 决定这张卡能打开哪些门——自己的家门、公共健身房,还是仅限物业的设备间
如果访问控制失效,就相当于任何住户都能用门禁卡打开整栋楼的所有房间,包括他人家门和管理员办公室,这将带来严重的安全隐患。
漏洞类型
访问控制漏洞主要分为两种类型,理解它们的关键是区分权限的"水平"与"垂直"维度。
水平越权 (Horizontal Privilege Escalation)
定义: 相同权限级别的用户能够访问彼此的私有数据。
比喻: 你和邻居都是普通住户,但你却能用自己的钥匙打开邻居的家门。
实际案例:
正常访问: https://example.com/user/profile?userId=123 (查看自己的资料)
攻击尝试: https://example.com/user/profile?userId=124 (查看他人的资料)
如果服务器未验证当前登录用户是否是资源的合法所有者,攻击者只需修改URL参数就能访问其他用户的敏感信息(电话、地址、订单等)。
垂直越权 (Vertical Privilege Escalation)
定义: 低权限用户能够执行高权限用户才能进行的操作。
比喻: 普通住户不仅能打开自己家门,还能进入物业办公室操作整栋楼的监控系统。
实际案例:
- 前端界面根据用户角色显示不同功能(如管理员才能看到"删除用户"按钮)
- 但后端API接口
/api/admin/deleteUser未进行权限校验 - 攻击者以普通用户身份登录,通过抓包工具直接调用管理员API,成功删除其他用户
危害性: 垂直越权通常比水平越权危害更大,可能导致系统被完全控制。
攻击者常用手段
参数篡改
直接修改URL参数或请求体中的关键字段:
/order/detail?orderId=1001 → orderId=1002
/api/user/update → {"userId": 999, "role": "admin"}
强行浏览 (Forced Browsing)
尝试访问未授权的URL路径:
/admin
/config
/api/internal/settings
/../../../etc/passwd (路径遍历攻击)
元数据操纵
篡改身份凭证或会话信息:
- 修改JWT Token中的角色字段
- 伪造简单可预测的Session ID
- 篡改Cookie中的用户权限标识
防御策略
核心原则
永远不要信任客户端传来的任何权限信息,所有授权决策必须在服务器端执行。
实施最小权限原则
确保每个用户或服务只拥有完成其任务所需的最小权限集。
Gin框架实现示例:
CodeBlock Loading...
服务器端强制校验
每个资源访问都必须验证:
- 用户是否已认证
- 用户是否有权限访问该资源
- 用户是否是资源的合法所有者(防止水平越权)
防止水平越权示例:
CodeBlock Loading...
使用成熟的访问控制模型
基于角色的访问控制 (RBAC):
CodeBlock Loading...
使用间接对象引用
避免在URL中直接暴露数据库ID,使用UUID或加密ID:
CodeBlock Loading...
记录与监控
实现访问日志和异常检测:
CodeBlock Loading...
总结
失效的访问控制是OWASP Top 10中排名第一的安全风险,其危害巨大且极为普遍。这类漏洞本质上是逻辑缺陷,源于开发过程中对权限校验的疏忽。
防护要点:
- ✅ 在服务器端为每个操作实施严格的权限检查
- ✅ 遵循"永不信任客户端"和"最小权限"原则
- ✅ 使用成熟的访问控制框架(如RBAC)
- ✅ 验证用户不仅有权限访问资源类型,还要验证是否有权访问特定资源实例
- ✅ 实施全面的日志记录和异常监控