垂直越权如何检测?全面解析与实战指南
目录导读
垂直越权的核心概念与危害
什么是垂直越权? 垂直越权(Vertical Privilege Escalation)是指低权限用户(如普通用户)通过某种手段获取高权限用户(如管理员)的访问权限或操作能力,一个普通用户直接访问管理员专属的删除用户接口,或查看所有用户的敏感数据。

为什么需要检测垂直越权? 据OWASP统计,垂直越权漏洞在Web应用中占比高达35%以上,且常导致:
- 数据泄露:普通用户可查看管理员级别的用户信息、财务数据
- 系统破坏:低权限用户执行删除、修改等高危操作
- 法律风险:GDPR、网络安全法对数据保护有严格规定
典型案例:某电商平台普通用户通过修改URL中的 /user/order?id=1 为 /admin/order?id=1 直接访问所有订单数据,导致百万用户信息泄露。
垂直越权的检测原理
垂直越权的本质是权限校验缺失,检测的核心逻辑是:
- 身份鉴别:确认当前用户角色(普通用户/管理员)
- 权限校验:检查用户是否拥有执行该操作的授权
- 操作执行:验证服务器是否在授权通过后才执行操作
检测流程:
发送请求(含低权限cookie) -> 访问高权限接口 -> 观察响应:
- 返回200且包含敏感数据 = 垂直越权存在
- 返回403/401 = 权限校验正常
- 返回302重定向到登录页 = 会话校验失效
检测前的准备工作
收集应用结构信息
- 获取用户角色列表(普通用户、VIP用户、管理员)
- 标记所有权限相关接口(后台管理、用户管理、数据导出)
- 记录访问控制机制(RBAC、ABAC、URL权限映射)
创建测试账号
- 低权限账号:普通用户
- 高权限账号:管理员 (注意:测试环境需与实际生产隔离)
配置测试工具
- 浏览器插件:EditThisCookie、Fiddler
- 抓包工具:Burp Suite、Charles
- 自动化脚本:Python + requests库
静态代码审计方法
权限校验函数定位
搜索常见权限校验关键字:
if(user.role == 'admin') { // 执行操作 }
if(!hasPermission('delete_user')) { return 403 }
重点检查:控制器层、中间件层、API入口
角色判断逻辑分析
常见漏洞模式:
// 错误示例:仅判断角色名称
if(user.getRole().equals("admin")) { // 高风险 }
// 正确示例:使用角色ID+权限枚举
if(user.getRoleId() == RoleEnum.ADMIN.getCode() && permissionCheck()) { }
接口路由扫描
检查是否为所有高权限接口添加了权限校验中间件:
// 漏洞示例:只有部分接口有校验
@GetMapping("/admin/user/{id}") // 未加 @PreAuthorize
// 安全示例:全局路由校验
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin/**")
动态渗透测试方法
Cookie/Token替换法
步骤:
- 使用普通用户登录,获取SessionID或Token
- 记录管理员接口URL(如
/admin/dashboard) - 使用普通用户的认证信息直接请求该接口
curl -X GET http://example.com/admin/dashboard -H "Cookie: sessionid=普通用户session"
HTTP请求头伪造
- 尝试修改
X-Forwarded-For或X-Remote-User头 - 设置
Authorization: Bearer为管理员Token(如果可猜测)
参数遍历法
- 遍历用户ID(如
/admin/user?id=1替换为id=2) - 修改角色字段(如
role=user改为role=admin)
接口路径探测
- 使用路径爆破工具(如dirsearch)扫描隐藏后台入口
- 测试常见路径:
/api/admin、/v2/admin、/console
自动化工具检测方案
Burp Suite插件
- Auth Analyzer:自动比较不同角色的请求响应
- Autorize:一键检测越权漏洞(支持自定义Header)
开源工具推荐
# 使用Python编写简易检测脚本
import requests
class VerticalPrivilegeChecker:
def __init__(self, low_token, high_token, target_url):
self.low_token = low_token
self.high_token = high_token
self.target_url = target_url
def check(self):
# 低权限用户请求
low_resp = requests.get(self.target_url,
headers={"Authorization": self.low_token})
# 高权限用户请求
high_resp = requests.get(self.target_url,
headers={"Authorization": self.high_token})
if low_resp.status_code == 200 and high_resp.status_code == 200:
if low_resp.text == high_resp.text:
return f"漏洞确认:权限校验完全缺失"
else:
return f"权限校验正常,低用户返回{low_resp.status_code}"
基于AI的检测
利用机器学习分析API请求图谱,自动识别异常权限访问模式。
- 同一IP在不同角色间频繁切换
- 普通用户请求的接口权限值异常
常见检测误区与难点
❌ 误区1:只检查显式拒接
正确做法:不仅检查403错误,还需对比响应内容。
- 普通用户请求管理接口返回200但内容为空,可能是数据过滤而非权限校验
- 真实越权:接口返回相同数据给不同角色
❌ 误区2:忽略框架默认配置
常见陷阱:
- Spring Security的
permitAll()覆盖了@PreAuthorize - JWT Token中角色字段被篡改(未签名验证)
❌ 误区3:仅测试单一接口
需要系统化检测:从用户注册到数据导出的完整业务流中的权限点
检测难点
- 微服务架构:权限校验分散在不同服务,需要交叉验证
- 垂直越权+水平越权混合:普通用户同时访问其他用户的管理接口
- 异步权限校验:前端做了权限限制但后端未校验
问答:垂直越权检测的核心问题
Q1:垂直越权和水平越权有什么区别?
答:
- 垂直越权:不同权限角色之间的越权(普通用户访问管理员接口)
- 水平越权:同权限用户之间的越权(用户A访问用户B的数据)
检测方法类似,但垂直越权更关注角色校验,水平越权关注用户ID校验。
Q2:没有管理员测试账号怎么办?
答:
- 尝试通过XSS或CSRF获取管理员session
- 分析前端代码查找后台接口路径
- 使用爬虫技术自动注册并诱捕管理员账号(需经授权)
Q3:检测到垂直越权后如何修复?
答:
- 在控制器层添加
@PreAuthorize("hasRole('ADMIN')") - 实现自定义中间件进行全局权限校验
- 使用
RBAC模型,确保每个接口都与权限矩阵对应 - 定期进行安全审计,使用自动化测试用例覆盖所有接口
Q4:移动端API如何检测垂直越权?
答:
- 使用mitmproxy或Fiddler抓取HTTPS流量
- 逆向APK获取API接口文档
- 重点检测用户角色字段是否可篡改
Q5:检测工具会不会破坏生产环境?
答:
- 务必使用测试环境或沙箱环境
- 使用只读权限的测试账号
- 工具设置请求频率限制(如每秒100次)
- 采取数据脱敏策略:不返回真实敏感字段
垂直越权检测需要结合静态代码分析、动态渗透测试和自动化工具,重点检查权限校验的每个环节。任何在请求中可被篡改的用户角色信息,都是潜在的安全漏洞,建议建立完善的CI/CD安全流水线,在每次代码部署时自动执行越权检测用例。