访问控制失效的概念
访问控制(Access Control),也称为授权(Authorization),是安全模型中的核心环节。它发生在认证(Authentication,即验证用户身份)之后,负责决定'一个已认证的用户是否有权限执行某项操作或访问某个资源'。
访问控制损坏(Broken Access Control)就是指应用程序未能正确地实施这些权限控制,导致攻击者能够绕过授权机制,访问本应无权访问的功能或数据。简单来说,就是'越权'。
访问控制失效是一种常见的安全漏洞,在 OWASP Top 10 2021 榜单中位列第一,是 Web 应用程序安全的主要威胁之一。
![图片]
注:OWASP Top 10:OWASP 前十名 | OWASP 基金会
访问控制失效的核心问题在于应用程序未能强制执行'最小权限原则',导致用户可以执行超出其权限范围的操作。这种漏洞可能表现为水平越权(同一权限级别的用户访问其他用户的数据)或垂直越权(低权限用户访问高权限功能)。
访问控制失效的类型
访问控制失效(Broken Access Control)是一个大类,包含多种具体的表现形式。主要可以划分为三大类。
1. 水平越权
同一权限级别的用户能够访问其他用户的数据或功能。例如,用户 A 可以查看或修改用户 B 的账户信息。核心问题:系统在处理请求时,没有验证当前登录的用户是否是所请求数据的所有者。
2. 垂直越权
低权限用户能够访问高权限功能。例如,普通用户能够访问管理员功能。核心问题:系统没有基于用户的角色(Role)来限制对功能或页面的访问。
3. 上下文相关的访问控制缺失
用户有权执行某个操作,但不能在当前业务流程的上下文中执行,或者操作的顺序和状态不正确。例如在一个网购流程中(添加商品->支付->确认订单),攻击者直接跳过'支付'步骤,访问'确认订单'的 API 端点,从而未支付就完成了订单。核心问题:系统没有验证操作是否符合业务逻辑的流程和状态。
访问控制失效的示例
下面我们通过 WebGoat 靶场学习访问控制失效(Broken Access Control)。
WebGoat 搭建简单,只需要下载 WebGoat 的 jar 文件,链接:https://github.com/WebGoat/WebGoat/releases
下载下来后放在一个文件夹里,然后在这个文件夹里打开命令行,在命令行里运行命令:
java -Dfile.encoding=UTF-8 -jar webgoat-2025.3.jar
如需指定端口,可添加参数。命令:
java -jar webgoat-2025.3.jar --webgoat.port=8001 --webwolf.port=8002
![图片]
![图片]
访问 http://127.0.0.1:8001/webgoat
![图片]
注册账户
![图片]
![图片]
左侧栏对 OWASP Top 10 都有讲解。点击 Broken Access Control,可以看到有 4 个示例。
![图片]
1. Hijack a Session:劫持会话
![图片]
会话劫持是一种攻击手段,攻击者通过某种方式获取用户的会话标识符(Session ID),然后使用这个标识符来冒充用户,非法访问该用户的账户和数据。简单来说,就是攻击者'偷走了你的登录状态',系统误以为他是你。
![图片]
这一关的意图是让我们预测一个已经登录了的用户的 hijack_cookie,利用这个 cookie 访问属于其他人的经过身份验证的会话。
我们输入自己的账号密码,抓个包试试。
![图片]
可以看到 response 里 set-cookie 返回了一个 hijack_cookie,值为 5313965668152351398-1756258343191,下面显示的是失败信息。我们再发几次,返回的 如下:

