什么是垂直越权?

垂直越权(Vertical Privilege Escalation)是指用户通过恶意手段尝试访问超出其权限范围的资源或执行更高级别权限操作的行为。
这是因系统没有正确验证用户身份或授权导致的安全漏洞,攻击者可以利用这些漏洞访问管理员、超级用户或更高级别的权限。


垂直越权的常见场景

  1. 普通用户越权为管理员

    用户尝试访问管理员面板,例如直接访问 /admin 页面。
    如果系统没有验证用户的角色或权限,该用户可以执行管理员功能,例如删除用户、修改配置。

  2. 越权执行敏感操作

    用户通过修改请求直接调用高权限的 API,比如重置他人密码或获取敏感数据。


垂直越权的案例

案例 1:未验证用户角色的管理面板

一个在线教育系统,学生只能查看课程内容,而管理员可以添加或删除课程。假设有以下 URL:

学生访问:https://example.com/student/dashboard
管理员访问:https://example.com/admin/dashboard

如果系统仅通过 URL 控制访问,而没有检查用户是否为管理员,那么普通用户可以通过直接访问 /admin/dashboard 获取管理员权限。

攻击流程:
  1. 普通用户登录后访问自己的控制面板。
  2. 修改浏览器中的 URL,将 /student/dashboard 改为 /admin/dashboard
  3. 如果系统没有验证用户身份,用户即可越权访问管理员功能。

案例 2:越权调用 API

某系统的密码重置 API:

POST /api/admin/reset-password
{
  "userId": 1001,
  "newPassword": "123456"
}

普通用户尝试调用该接口为他人重置密码。如果系统只根据登录状态验证请求,而没有验证用户角色,普通用户即可越权重置任何账户的密码。


如何防止防止垂直越权?

  1. 基于角色的访问控制(RBAC)

    确保每个资源、API 都有清晰的权限定义。
    在每次请求时验证用户角色是否具备访问权限。

    示例:

    if (!user.hasRole("ADMIN")) {
        throw new UnauthorizedAccessException("Access Denied");
    }
    
  2. 最小权限原则

    用户仅能访问与其角色相关的资源和操作,任何超出范围的请求均应拒绝。

  3. 后端强制校验

    不仅仅依赖前端控制权限,后端必须在每次请求中验证用户身份及权限。
    确保 API 中嵌入用户角色检查逻辑。

  4. 使用安全框架

    使用像 Spring Security、Shiro 等安全框架,它们提供了内置的权限验证机制。

  5. 日志与监控

    记录用户的访问行为,并监控异常访问模式,及时响应安全威胁。

  6. 代码审计和渗透测试

    定期检查代码逻辑,尤其是权限验证部分。
    使用渗透测试工具模拟攻击,检测是否存在越权漏洞。


具体代码案例

正确实现权限校验

@GetMapping("/admin/dashboard")
public String getAdminDashboard(Authentication authentication) {
    if (authentication == null || !authentication.getAuthorities().contains("ROLE_ADMIN")) {
        throw new AccessDeniedException("Unauthorized access");
    }
    return "admin_dashboard";
}

防止越权调用 API

@PostMapping("/api/admin/reset-password")
public ResponseEntity<?> resetPassword(@RequestBody ResetPasswordRequest request, Authentication auth) {
    if (!auth.getAuthorities().contains("ROLE_ADMIN")) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Access Denied");
    }
    // 执行密码重置逻辑
}

总之,垂直越权问题的核心是用户权限验证不到位。防止垂直越权需要系统全面设计和多层验证,包括基于角色的权限控制、后端验证机制以及日志监控。开发者在设计系统时要有清晰的权限模型,并确保所有敏感操作都具备严格的权限检查逻辑。