一、横向越权(水平越权)
定义与原理 横向越权是指 相同权限层级的用户 通过绕过资源归属验证,非法访问或操作其他同级用户的数据或功能。其本质是系统未严格校验“当前用户是否有权操作目标资源”。
攻击方式
参数篡改:直接修改请求中的标识参数(如用户ID、订单ID)。
GET /api/user?uid=123 → 篡改为 uid=456路径遍历:利用未过滤的路径参数访问其他用户文件。
GET /download?file=userA/photo.jpg → 篡改为 file=../config/db.conf批量枚举:通过遍历ID范围(如1~1000)获取大量用户数据。
技术细节
漏洞根源:
后端接口直接信任客户端提交的资源标识符(如
uid、order_id)。未在数据库查询中绑定当前用户身份(如
SELECT * FROM orders WHERE id={order_id} AND user_id={current_user})。
高危场景:
用户个人中心、订单管理、文件下载等涉及用户唯一标识的功能。
检测方法
手动测试:修改请求参数(如Cookie、URL、Body中的ID),观察是否返回非归属数据。
工具辅助:使用Burp Suite的Intruder模块批量枚举ID,检测越权响应(HTTP 200)。
代码审计:检查后端是否对资源操作进行用户身份绑定。
防御方案
强制绑定用户身份:所有资源操作需关联当前会话用户。
禁用客户端可控标识符:资源ID应通过服务端生成(如UUID),而非自增数字。
日志监控:记录异常ID访问行为,触发告警(如同一用户频繁访问不同ID)。
二、纵向越权(垂直越权)
定义与原理 纵向越权是指 低权限用户 通过绕过权限校验,非法获取高权限功能或数据(如普通用户访问管理员接口)。其核心问题是系统未严格分离角色权限层级。
攻击方式
直接访问高权限接口:猜测或探测管理员API路径。
GET /admin/deleteAllUsers → 普通用户直接调用请求头篡改:伪造角色字段(如
X-User-Role: admin)。功能滥用:利用业务逻辑漏洞间接提权(如普通用户触发后台任务)。
技术细节
漏洞根源:
权限校验依赖客户端传递的参数(如
role=admin)。未对敏感接口强制角色验证(如缺少
@PreAuthorize("hasRole('ADMIN')"))。
高危场景:
后台管理功能、数据导出接口、系统配置修改等。
检测方法
接口探测:使用目录爆破工具(如DirBuster)扫描
/admin、/api/v1/admin等路径。权限参数篡改:修改请求中的角色/权限字段,观察是否绕过校验。
代码审计:检查接口是否遗漏权限注解,或硬编码测试账号权限。
防御方案
基于角色的访问控制:每次调用数据前都对用户身份进行验证。
服务端动态鉴权:权限信息从数据库或Token中获取,禁止客户端修改。
最小化权限分配:默认拒绝所有请求,按需开放必要权限。
三、横向与纵向越权对比
四、真实漏洞案例
横向越权案例:
某银行APP漏洞:通过修改
account_id参数,可查看他人银行卡余额。漏洞修复:后端在查询时强制绑定用户ID与账户ID关联。
纵向越权案例:
某CMS系统漏洞:普通用户通过
/admin/install接口重装系统,清空数据库。漏洞修复:隐藏后台接口,增加管理员Token验证。
五、总结
横向越权:关注 数据归属,需强化“谁的数据谁管理”逻辑。
纵向越权:关注 权限边界,需严格分离角色与功能权限。
通用防护:
输入输出过滤(如防止路径遍历、SQL注入)。
自动化漏洞扫描(如OWASP ZAP、Acunetix)。
定期渗透测试与代