垂直越权如何检测?

wen 网络安全 51

垂直越权如何检测?全面解析与实战指南

目录导读

  1. 垂直越权的核心概念与危害
  2. 垂直越权的检测原理
  3. 检测前的准备工作
  4. 静态代码审计方法
  5. 动态渗透测试方法
  6. 自动化工具检测方案
  7. 常见检测误区与难点
  8. 问答:垂直越权检测的核心问题

垂直越权的核心概念与危害

什么是垂直越权? 垂直越权(Vertical Privilege Escalation)是指低权限用户(如普通用户)通过某种手段获取高权限用户(如管理员)的访问权限或操作能力,一个普通用户直接访问管理员专属的删除用户接口,或查看所有用户的敏感数据。

垂直越权如何检测?

为什么需要检测垂直越权? 据OWASP统计,垂直越权漏洞在Web应用中占比高达35%以上,且常导致:

  • 数据泄露:普通用户可查看管理员级别的用户信息、财务数据
  • 系统破坏:低权限用户执行删除、修改等高危操作
  • 法律风险:GDPR、网络安全法对数据保护有严格规定

典型案例:某电商平台普通用户通过修改URL中的 /user/order?id=1/admin/order?id=1 直接访问所有订单数据,导致百万用户信息泄露。


垂直越权的检测原理

垂直越权的本质是权限校验缺失,检测的核心逻辑是:

  1. 身份鉴别:确认当前用户角色(普通用户/管理员)
  2. 权限校验:检查用户是否拥有执行该操作的授权
  3. 操作执行:验证服务器是否在授权通过后才执行操作

检测流程

发送请求(含低权限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替换法

步骤:

  1. 使用普通用户登录,获取SessionID或Token
  2. 记录管理员接口URL(如 /admin/dashboard
  3. 使用普通用户的认证信息直接请求该接口
    curl -X GET http://example.com/admin/dashboard
    -H "Cookie: sessionid=普通用户session"

HTTP请求头伪造

  • 尝试修改 X-Forwarded-ForX-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:检测到垂直越权后如何修复?

  1. 在控制器层添加 @PreAuthorize("hasRole('ADMIN')")
  2. 实现自定义中间件进行全局权限校验
  3. 使用 RBAC 模型,确保每个接口都与权限矩阵对应
  4. 定期进行安全审计,使用自动化测试用例覆盖所有接口

Q4:移动端API如何检测垂直越权?

  • 使用mitmproxy或Fiddler抓取HTTPS流量
  • 逆向APK获取API接口文档
  • 重点检测用户角色字段是否可篡改

Q5:检测工具会不会破坏生产环境?

  1. 务必使用测试环境或沙箱环境
  2. 使用只读权限的测试账号
  3. 工具设置请求频率限制(如每秒100次)
  4. 采取数据脱敏策略:不返回真实敏感字段

垂直越权检测需要结合静态代码分析、动态渗透测试和自动化工具,重点检查权限校验的每个环节。任何在请求中可被篡改的用户角色信息,都是潜在的安全漏洞,建议建立完善的CI/CD安全流水线,在每次代码部署时自动执行越权检测用例。

抱歉,评论功能暂时关闭!