一、什么是垂直越权和水平越权
1.水平越权(Horizontal Privilege Escalation)
- 定义:同一权限等级的用户之间,通过非法手段访问或操作其他用户的资源。
- 示例:
- 用户A通过篡改URL参数(如订单ID)访问用户B的订单信息。
- 用户绕过权限验证,通过API直接获取他人数据。
- 常见原因:
- 服务端未校验资源归属,如数据库查询未关联当前用户ID。
- 依赖客户端传递的参数(如用户ID)进行权限判断,未在服务端二次验证。
- 防范措施:
- 强制资源关联用户:在数据库查询中,始终将当前用户ID作为条件(如
SELECT * FROM orders WHERE user_id = ? AND order_id = ?
)。 - 服务端校验:对每个请求的资源和操作进行归属检查,避免依赖客户端输入。
- 最小化信息暴露:避免在URL或响应中直接暴露敏感ID(如使用UUID替代自增ID)。
- 强制资源关联用户:在数据库查询中,始终将当前用户ID作为条件(如
2.垂直越权(Vertical Privilege Escalation)
- 定义:低权限用户通过漏洞获取高权限角色的功能或数据。
- 示例:
- 普通用户访问管理员后台或调用删除用户的API。
- 通过修改请求参数(如角色字段)提升自身权限等级。
- 常见原因:
- 未对敏感操作进行角色/权限校验(如直接访问管理接口)。
- 客户端传递角色参数时未在服务端验证合法性。
- 防范措施:
- 基于角色的访问控制(RBAC):明确定义角色权限,限制用户仅能访问其角色允许的资源。
- 权限最小化原则:默认拒绝所有操作,仅显式开放必要权限。
- 敏感操作隔离:管理功能与普通功能分离,并通过中间件强制校验角色(如使用
@PreAuthorize("hasRole('ADMIN')")
)。
3.通用防御策略
- 服务端校验:所有权限检查必须在服务端完成,客户端不可信。
- 输入验证:禁止用户提交角色、用户ID等敏感字段,若需传递需严格校验合法性。
- 日志与监控:记录异常访问行为,及时发现越权尝试。
- 安全测试:
- 水平越权测试:使用同一角色账号尝试访问他人资源。
- 垂直越权测试:用低权限账号尝试执行高权限操作(如修改/删除他人数据)。
4.案例对比
场景 | 水平越权 | 垂直越权 |
---|---|---|
权限变化 | 同一层级用户间横向访问 | 低权限用户获取高权限功能 |
示例 | 用户A查看用户B的订单 | 普通用户删除他人账号 |
防御重点 | 资源归属校验 | 角色/权限隔离 |
通过严格的访问控制设计和持续的安全测试,可有效避免水平与垂直越权漏洞,保障系统安全性。
二、典型案例分析
以下是水平越权与垂直越权在具体场景中的典型案例分析,结合漏洞原理和实际应用场景进行说明:
一、水平越权案例
1. 篡改URL参数访问他人数据(电商平台)
- 场景:用户A登录后查看自己的订单详情页,URL中订单ID为
order_id=1001
。若用户A将ID改为order_id=1002
,直接访问后成功显示用户B的订单信息。 - 漏洞原因:后端未校验当前用户是否拥有该订单的归属权限,仅通过订单ID查询数据。
- 典型工具利用:使用Burp Suite修改请求参数,验证越权可能性。
2. 修改用户名参数越权登录(Pikachu靶场)
- 场景:用户
lucy
登录时抓包,将请求中的username=lucy
改为username=kobe
,成功以kobe
身份登录并查看其个人信息。 - 漏洞原因:后端仅依赖客户端传递的用户名参数,未关联会话或二次验证用户身份。
- 防御建议:使用会话ID或Token绑定用户身份,禁止直接通过用户名参数判断权限。
3. 遍历不可控ID获取文件(企业文档系统)
- 场景:用户A通过修改文件路径中的ID(如
file_id=516668
)访问其他用户的私有文件,甚至通过遍历ID获取全站文件。 - 漏洞原因:资源ID未加密或随机化,且未校验用户对文件的访问权限。
二、垂直越权案例
1. 普通用户执行管理员操作(Pikachu靶场)
- 场景:管理员添加用户的请求数据包被普通用户
pikachu
捕获,替换其Cookie中的PHPSESSID
为普通用户会话ID后重放请求,成功添加用户。 - 漏洞原因:后端仅验证登录状态,未校验用户角色权限,导致低权限用户执行高权限操作。
- 典型工具利用:通过Burp Suite的Authz插件替换Cookie验证越权。
2. 普通用户访问管理后台(企业系统)
- 场景:普通用户通过直接访问管理员后台URL(如
/admin/user/list
),绕过前端界面隐藏限制,成功查看或修改用户列表。 - 漏洞原因:后端未对管理接口进行角色权限控制,仅依赖前端隐藏入口。
3. 修改角色参数提升权限(用户注册功能)
- 场景:普通用户注册时抓包,将请求中的
role=user
改为role=admin
,后端未校验直接赋予管理员权限。 - 漏洞原因:用户提交的角色参数未过滤,且后端未二次验证用户是否有权修改角色。
三、综合防御策略
- 强制资源归属校验
所有数据操作需关联当前用户ID(如SELECT * FROM orders WHERE user_id=当前用户ID
)。 - 基于角色的访问控制(RBAC)
明确定义角色权限,敏感操作需显式授权(如Spring Security的@PreAuthorize
注解)。 - 加密敏感参数
使用UUID替代自增ID,或对资源ID进行哈希加密,防止遍历。 - 双重验证机制
前端隐藏高权限功能,后端仍需强制校验用户角色和权限。 - 日志与监控
记录异常请求(如频繁修改ID、尝试访问管理接口),及时告警。
四、案例对比与工具推荐
漏洞类型 | 测试工具/方法 | 典型场景引用 |
---|---|---|
水平越权 | Burp Suite参数篡改、小米范检测工具 | 电商订单ID遍历 |
垂直越权 | Authz插件、secscan-authcheck工具 | 管理员功能重放 |