本文目录导读:

接口越权(Broken Access Control)是OWASP Top 10中排名第一的安全漏洞,检测接口越权需要结合自动化工具与手动测试,核心思路是更换用户身份(或未登录状态)去执行另一个用户(或管理员)才能执行的操作。
以下是系统性的检测发现方法,分为三个层面:逻辑理解、手动测试、自动化扫描。
核心检测逻辑:三种越权类型
在检测前,先明确你要找什么:
- 水平越权:普通用户A,试图操作普通用户B的数据(查看B的订单、修改B的个人信息)。
- 检测特征:用户ID、订单ID、手机号等关键参数是否可枚举或篡改。
- 垂直越权:普通用户,试图执行管理员才能做的操作(普通用户访问后台管理接口)。
- 检测特征:角色标识(如
role=admin)、接口路径(如/api/admin/)、未校验HTTP方法(如本该POST的接口用GET也能访问)。
- 检测特征:角色标识(如
- 未授权访问:未登录(无Cookie/Token),直接访问需要登录的接口。
- 检测特征:接口未校验身份凭证。
手动测试方法(最有效,能发现业务逻辑漏洞)
水平越权检测(核心步骤)
-
场景:假设有两个普通用户A和B,系统有两个接口:
GET /api/user/profile?id=123(获取用户信息)POST /api/order/delete(订单删除,参数为订单号)
-
测试流程:
- 准备两个用户:登录用户A,通过抓包工具(如Burp Suite)获取A的Cookie/Token。
- 访问A的数据:正常请求
?id=123,记录响应包(A的姓名、电话等)。 - 篡改参数:将ID改为B的ID(如124),发送请求。
- 结果判断:如果返回了B的电话、地址等信息,则存在IDOR水平越权。
- 跨用户操作:用户A删除自己的订单(订单号0001),抓包,然后用A的Token,将订单号改为B的订单号(0002)重放请求。
- 结果判断:如果B的订单被删除,则为水平越权。
垂直越权检测(核心步骤)
- 场景:普通用户试图执行管理员接口。
- 测试流程:
- 收集接口:使用管理员账号访问Web应用,通过浏览器的抓包或站点地图,记录所有管理员功能对应的接口路径(如
/api/admin/deleteUser)。 - 替换Cookie:退出管理员,登录一个普通用户。
- 重放请求:将普通用户的Cookie/Token,放到刚才记录的
/api/admin/deleteUser请求中,重放。- 结果判断:如果返回200且成功执行了操作(如删除了用户),则为垂直越权。
- 注意:不要直接进行破坏性操作(如删库、改密码),建议在测试环境或使用具有删除权限的测试用户进行。
- 收集接口:使用管理员账号访问Web应用,通过浏览器的抓包或站点地图,记录所有管理员功能对应的接口路径(如
未授权访问检测
- 场景:完全不登录,直接访问接口。
- 测试流程:在浏览器或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(付费但功能最强):
- 将浏览器代理到Burp,正常浏览应用(登录不同角色)。
- 在 Target -> Scope 设置目标范围。
- 右键目标主机,选择 Engagement tools -> Discover content 或 Scan -> Active Scan。
- 扫描完成后,查看 Issue Activity为 Insecure 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-权限-用户角色的关联图,自动生成访问控制矩阵。
- 工具:
Depesz、Jail(针对Go应用)等。 - 适用场景:大型复杂应用(微服务架构),手动测试难以覆盖全。
关键检测指标与判断标准
当你重放请求后,如何判定存在越权?
| 返回结果 | 是否越权 | 解释 |
|---|---|---|
| HTTP 200 + 返回了数据 | 是 | 最明显的标志,例如用普通用户Token请求管理员接口,成功返回了所有用户的列表。 |
| HTTP 302/301 跳转到登录页 | 否(正常) | 权限校验拦截到了,重定向了。 |
| HTTP 403 Forbidden | 否(正常) | 服务器明确拒绝了该请求。 |
| HTTP 500 服务器错误 | 可疑 | 可能是参数校验失败,也可能是因为越权导致数据格式异常崩溃,需要进一步调试。 |
| 返回了“无权限”等错误码 | 否(正常) | 系统有权限校验逻辑。 |
| 返回了其他用户的数据 | 是 | 水平越权标志。 |
| 与管理员请求相同(长度/内容一致) | 是 | 需要比对响应包。 |
实战检测流程总结(最佳实践)
- 准备阶段:创建3个测试账号(管理员、普通用户A、普通用户B)。
- 信息收集:通过抓包、阅读前端JS代码、查看API文档,梳理出所有CURD接口及其参数(尤其是ID、用户标识、角色字段)。
- 静态分析(可选):查看后端代码中是否存在
@PreAuthorize("hasRole('ADMIN')")等注解,看是否有遗漏。 - 动态测试:
- 水平:用A的Token → 请求B的数据ID。
- 垂直:用A的Token → 请求管理员的API路径。
- 未授权:清除Cookie → 请求任意API。
- 批量:测试批量查询、导出功能是否限制范围。
- 工具辅助:开启Autorize插件,使用管理员账号浏览应用,观察Autozie的告警列表。
- 结果验证:对可疑请求,通过Repeater手动修改参数确认,排除误报(例如有些接口虽然返回200,但实际只是返回了错误提示,没有泄露数据)。
- 报告:记录接口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、角色、订单号),所有权限校验必须发生在服务端。 检测就是去验证这个原则是否被打破。