接口越权如何检测发现

wen 开源项目 25

从原理到自动化工具全解析

📖 目录导读

  1. 什么是接口越权?——两大类型与核心风险
  2. 越权漏洞检测的3个基础步骤(附案例)
  3. 自动化工具:Burp Suite、Postman、自定义脚本对比
  4. 实战问答:企业如何建立越权检测流程?
  5. 防御与修复:从源头阻断越权攻击

什么是接口越权?——两大类型与核心风险

接口越权(Authorization Bypass)是Web应用最常见的高危漏洞之一,指攻击者通过篡改请求参数、Cookie、Token或HTTP头部,绕过权限校验逻辑,访问本无权访问的资源或执行越权操作。

接口越权如何检测发现

两大常见类型:

  • 水平越权:同级别用户之间的越权,普通用户A通过修改订单ID“order_id=1001”为“order_id=1002”,查看用户B的订单详情。
  • 垂直越权:低权限用户访问高权限功能,普通用户通过修改URL路径“/api/v1/admin/deleteUser”或添加Header“Role: admin”,直接调用管理员接口。

为什么越权漏洞难以发现?
因为应用前端通常会隐藏“超越权限”的按钮或菜单,但后端API如果没有对每次请求做独立的权限校验,攻击者只需用抓包工具拦截请求、修改参数即可绕过。


越权漏洞检测的3个基础步骤(附案例)

手动逻辑分析——定位“无校验”的API

使用Burp Suite或浏览器开发者工具(F12 → 网络),抓取所有API请求,重点关注:

  • URL路径中包含用户ID、订单ID、产品ID等数字参数的GET请求(如 /api/getProfile?userId=123
  • 携带CookieAuthorization: Bearer token但不校验token中用户角色的请求
  • 批量操作接口(如 /api/exportAllData)是否默认返回全局数据

案例:某电商平台,用户访问“我的订单”时,请求为POST /api/order?action=view&orderId=1001,抓包后修改orderId为1002,发现返回了另一个用户的订单详情,这就是典型的水平越权。

参数遍历与模糊测试

使用Burp Suite的Intruder或Postman的“批量请求”功能,对关键参数进行数字/字符串枚举测试:

  1. 修改userId=adminrole=superadmin 看是否能返回管理员数据
  2. 尝试Cookie中的session_id替换为其他用户ID(通过自注册两个账号交换验证)
  3. 测试HTTP Method越权:如原接口为GET /api/deleteUser,尝试改为DELETE /api/deleteUser?userId=xxx

自动化越权检测脚本(Python示例)

import requests
# 普通用户A的Token
token = "Bearer token_a"
target_url = "https://example.com/api/getUserProfile"
# 遍历用户ID范围1-100
for user_id in range(1, 101):
    headers = {"Authorization": token}
    payload = {"userId": user_id}
    res = requests.get(target_url, headers=headers, params=payload)
    if res.status_code == 200 and "password" in res.text:
        print(f"发现越权漏洞!可获取用户{user_id}的敏感信息")
        break

注意:自动化测试需要严格控制在测试环境,避免对生产数据造成污染。


自动化工具:Burp Suite、Postman、自定义脚本对比

工具 优势 劣势 适用场景
Burp Suite Pro 内置越权检测插件(如AuthMatrix),可自动扫描 付费版本功能完整,学习曲线陡峭 大型企业安全审计
Postman + Collection Runner 可视化操作,支持批量参数替换 需手动编写测试用例 开发自测、小团队QA
自定义Python脚本 高度灵活,可模拟复杂业务逻辑 需要编程能力 深度定制测试

推荐组合:先用Burp Suite的被动扫描发现潜在越权端点,再用Postman验证具体参数,最后用脚本做大规模枚举。


实战问答:企业如何建立越权检测流程?

Q1:越权检测应该放在开发的哪个阶段?
A:最佳实践是“左移”到开发阶段,在代码评审时,检查每个API控制器是否使用了统一的权限注解(如Spring Security的@PreAuthorize),在单元测试中,模拟不同角色用户调用接口,验证是否产生403/401返回。

Q2:怎么判断检测到的“越权”是真漏洞还是误报?
A:三步验证法:① 接口是否返回了“只有其他用户才能查看”的数据(如他人身份证号、手机号);② 该接口是否频繁用于“批量导出”等高风险操作;③ 修改参数后返回数据是否与预期一致,修改orderId后返回的订单金额、用户姓名与自己不同,即为有效漏洞。

Q3:企业可以只依赖自动化工具吗?
A:不能,自动化工具只能发现“参数可猜测”的越权(如简单数字递增),但对于业务逻辑复杂的垂直越权(如“加入购物车”接口绕过付款权限),必须依靠手动业务流测试,一个“普通用户”能否通过修改请求体中的isAdmin: falsetrue,调用隐藏的管理员审核接口。


防御与修复:从源头阻断越权攻击

核心防御原则:服务器端必须对每一次API请求进行“双重校验”——校验用户身份是否合法(认证),同时校验该身份是否有权操作此资源(授权)。

修复手段清单:

  1. 强制使用Token+Role分离:JWT Token中解析出用户ID和角色列表,每个接口用userId与资源持有者ID比对。
  2. 实施最小权限模型:禁止API路径中直接暴露用户ID,改用加密令牌(如UUID)或后端从Token中自动提取。
  3. 增加操作级权限校验:即便是“查看”操作,也要校验resource.ownerId == currentUser.id
  4. 对敏感参数加密或哈希:如订单ID使用HMAC-SHA256生成不可预测的字符串,避免攻击者猜测。
  5. 日志审计:记录所有越权尝试(如返回403但请求参数异常),设置实时告警。

最后提醒:越权检测不是一次性工作,每次版本迭代都需回归测试,推荐使用OWASP ZAP或Burp Suite的“Active Scan”扫描新增API,并结合人工渗透测试,形成“自动化+手动”的全覆盖检测体系。


延伸阅读:可搜索“OWASP 授权测试指南”、“API Security Testing Checklist”获取更多检测用例,如果遇到具体越权检测案例,欢迎在技术社区讨论。

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