接口越权如何检测发现

wen 网络安全 27

本文目录导读:

接口越权如何检测发现

  1. 核心检测逻辑:三种越权类型
  2. 手动测试方法(最有效,能发现业务逻辑漏洞)
  3. 自动化扫描方法(效率高,但可能漏过复杂逻辑)
  4. 关键检测指标与判断标准
  5. 实战检测流程总结(最佳实践)
  6. 硬骨头场景如何处理?

接口越权(Broken Access Control)是OWASP Top 10中排名第一的安全漏洞,检测接口越权需要结合自动化工具手动测试,核心思路是更换用户身份(或未登录状态)去执行另一个用户(或管理员)才能执行的操作。

以下是系统性的检测发现方法,分为三个层面:逻辑理解手动测试自动化扫描

核心检测逻辑:三种越权类型

在检测前,先明确你要找什么:

  1. 水平越权:普通用户A,试图操作普通用户B的数据(查看B的订单、修改B的个人信息)。
    • 检测特征:用户ID、订单ID、手机号等关键参数是否可枚举或篡改。
  2. 垂直越权:普通用户,试图执行管理员才能做的操作(普通用户访问后台管理接口)。
    • 检测特征:角色标识(如role=admin)、接口路径(如/api/admin/)、未校验HTTP方法(如本该POST的接口用GET也能访问)。
  3. 未授权访问:未登录(无Cookie/Token),直接访问需要登录的接口。
    • 检测特征:接口未校验身份凭证。

手动测试方法(最有效,能发现业务逻辑漏洞)

水平越权检测(核心步骤)

  • 场景:假设有两个普通用户A和B,系统有两个接口:

    • GET /api/user/profile?id=123 (获取用户信息)
    • POST /api/order/delete (订单删除,参数为订单号)
  • 测试流程

    1. 准备两个用户:登录用户A,通过抓包工具(如Burp Suite)获取A的Cookie/Token。
    2. 访问A的数据:正常请求 ?id=123,记录响应包(A的姓名、电话等)。
    3. 篡改参数:将ID改为B的ID(如124),发送请求。
      • 结果判断:如果返回了B的电话、地址等信息,则存在IDOR水平越权
    4. 跨用户操作:用户A删除自己的订单(订单号0001),抓包,然后用A的Token,将订单号改为B的订单号(0002)重放请求。
      • 结果判断:如果B的订单被删除,则为水平越权。

垂直越权检测(核心步骤)

  • 场景:普通用户试图执行管理员接口。
  • 测试流程
    1. 收集接口:使用管理员账号访问Web应用,通过浏览器的抓包站点地图,记录所有管理员功能对应的接口路径(如 /api/admin/deleteUser)。
    2. 替换Cookie:退出管理员,登录一个普通用户
    3. 重放请求:将普通用户的Cookie/Token,放到刚才记录的 /api/admin/deleteUser 请求中,重放。
      • 结果判断:如果返回200且成功执行了操作(如删除了用户),则为垂直越权
      • 注意不要直接进行破坏性操作(如删库、改密码),建议在测试环境或使用具有删除权限的测试用户进行。

未授权访问检测

  • 场景:完全不登录,直接访问接口。
  • 测试流程:在浏览器或Burp中,删除所有Cookie、清除Token(Header中的Authorization),直接访问需要登录的接口URL(如 /api/order/list)。
    • 结果判断:如果返回了订单列表数据而非“未登录”报错,则为未授权访问。

参数篡改的进阶技巧

  • JSON参数篡改:如果接口参数是JSON格式,尝试修改其中的角色字段。
    • {"userId":123, "role":"user"}{"userId":123, "role":"admin"}
  • 对象引用枚举:对ID进行顺序、随机、UUID枚举。

    工具:Burp Intruder 设置 Payload 为 Numbers 或 Date 或 自定义字典。

  • 多参数遗漏:有些系统在增删改查时校验了某个参数(如user_id),但批量操作导出接口可能未校验。

自动化扫描方法(效率高,但可能漏过复杂逻辑)

使用自动化渗透工具(最推荐)

  • Burp Suite Professional(付费但功能最强)
    1. 将浏览器代理到Burp,正常浏览应用(登录不同角色)。
    2. Target -> Scope 设置目标范围。
    3. 右键目标主机,选择 Engagement tools -> Discover contentScan -> Active Scan
    4. 扫描完成后,查看 Issue ActivityInsecure Direct Object References (IDOR)Access Control Issues 的报告。
  • OWASP ZAP(免费开源)
    • 自动扫描Automated Scan 模式,会尝试发送各种篡改请求。
    • 主动扫描:启用 Access Control Testing 策略,需要配置用户列表(Admin User & Regular User),ZAP会自动切换角色重放请求并对比响应。

使用专用越权测试工具

  • Autorize (Burp插件,强烈推荐)
    • 原理:它会自动复制一个请求(比如手动点击了某个功能),然后用特定用户(如低权限用户、未登录用户)的Cookie替换原有的Cookie自动重放。
    • 用法:在插件中设置“低权限用户”的Cookie,当你在浏览器里用管理员账号操作时,插件会自动用低权限用户Cookie去重放每个请求,并标记响应长度/状态码是否和原请求相同(相同则存在越权)。
    • 优点:自动化程度极高,可以快速扫描整个应用的所有页面。
  • Burp Collaborator / Repeater:结合使用,手动修改参数后反复重放。

基于图论的越权检测(高级)

  • 原理:通过爬取应用,建立URL-权限-用户角色的关联图,自动生成访问控制矩阵。
  • 工具DepeszJail(针对Go应用)等。
  • 适用场景:大型复杂应用(微服务架构),手动测试难以覆盖全。

关键检测指标与判断标准

当你重放请求后,如何判定存在越权?

返回结果 是否越权 解释
HTTP 200 + 返回了数据 最明显的标志,例如用普通用户Token请求管理员接口,成功返回了所有用户的列表。
HTTP 302/301 跳转到登录页 否(正常) 权限校验拦截到了,重定向了。
HTTP 403 Forbidden 否(正常) 服务器明确拒绝了该请求。
HTTP 500 服务器错误 可疑 可能是参数校验失败,也可能是因为越权导致数据格式异常崩溃,需要进一步调试。
返回了“无权限”等错误码 否(正常) 系统有权限校验逻辑。
返回了其他用户的数据 水平越权标志。
与管理员请求相同(长度/内容一致) 需要比对响应包。

实战检测流程总结(最佳实践)

  1. 准备阶段:创建3个测试账号(管理员、普通用户A、普通用户B)。
  2. 信息收集:通过抓包、阅读前端JS代码、查看API文档,梳理出所有CURD接口及其参数(尤其是ID、用户标识、角色字段)。
  3. 静态分析(可选):查看后端代码中是否存在 @PreAuthorize("hasRole('ADMIN')") 等注解,看是否有遗漏。
  4. 动态测试
    • 水平:用A的Token → 请求B的数据ID。
    • 垂直:用A的Token → 请求管理员的API路径。
    • 未授权:清除Cookie → 请求任意API。
    • 批量:测试批量查询、导出功能是否限制范围。
  5. 工具辅助:开启Autorize插件,使用管理员账号浏览应用,观察Autozie的告警列表。
  6. 结果验证:对可疑请求,通过Repeater手动修改参数确认,排除误报(例如有些接口虽然返回200,但实际只是返回了错误提示,没有泄露数据)。
  7. 报告:记录接口URL、请求方法、参数、使用的Cookie/Token、返回的敏感数据样本、漏洞类型(水平/垂直/未授权)。

硬骨头场景如何处理?

  • 难以直接枚举的UUID:如果是 uuid(如 f47ac10b-58cc-4372-a567-0e02b2c3d479),手动硬猜基本不可能,但可以尝试:
    • UUID泄露:查看其他接口(如评论、分享、通知)是否泄露了其他用户的UUID。
    • 构造:某些系统使用 时间戳+用户ID 的哈希,可以尝试自己生成。
  • Token绑定IP/设备?:尝试更换IP或用户代理(User-Agent)重放。
  • JWT Token:尝试修改JWT payload中的角色(如role: user改为role: admin),或者删除JWT签名(服务端是否在校验?),很多老系统后端不校验签名,极易越权。

核心要诀: 永远不要信任客户端提交的任何参数(包括用户ID、角色、订单号),所有权限校验必须发生在服务端。 检测就是去验证这个原则是否被打破。

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