src/众测中的一些越权方式
字数 1701 2025-08-30 06:50:27
众测中的常见越权方式详解
1. 参数可遍历越权
原理:当接口参数为数字类型时,通过遍历参数值可能获取到其他用户的数据。
常见场景:
- 用户ID、订单ID等数字型参数
- 分页参数、序号等可预测的参数
测试方法:
- 修改数字参数为相邻值(如自己的ID是123,尝试124、125等)
- 使用Burp Suite的Intruder模块进行批量测试
案例:xx科学院大学某接口存在数字ID遍历越权
防御措施:
- 实施严格的权限验证
- 使用不可预测的UUID替代连续数字ID
- 记录和监控异常访问模式
2. 参数不可遍历越权
原理:当参数不可预测时,通过注册多个账号并替换参数测试越权可能性。
测试方法:
- 注册两个测试账号A和B
- 用账号A获取正常请求
- 替换关键参数为账号B的参数进行测试
危害扩大方法:
- 全局搜索JavaScript中的
arr变量 - 使用Burp Suite的Hex插件正则匹配
arr - 在Burp Suite中搜索
arr - 检查其他接口是否泄露
arr值
案例:xx国防工业职业技术学院存在此类越权
防御措施:
- 实施基于会话的身份验证
- 避免在前端暴露敏感参数
- 使用加密令牌替代明文参数
3. 参数制空越权
原理:当传入空参数时,后端可能返回所有记录。
常见原因:
- 默认查询所有记录的逻辑
- 错误处理不当导致异常时返回所有数据
测试方法:
- 传入空值:
null、""、undefined - 传入通配符:
%、* - 注意:使用
%时可能同时存在SQL注入漏洞
技术背景:
- LIKE和ORDER BY语句直接使用
#{}预编译会导致SQL报错 - 开发人员可能错误使用
${}导致LIKE注入和ORDER BY注入
案例:xxx公司存在制空越权漏洞
防御措施:
- 严格验证输入参数
- 为空参数返回错误而非所有数据
- 使用参数化查询
4. 参数类型越权
原理:当参数类型处理不当时,传入错误类型可能导致全表查询。
测试方法:
- 确认参数原始类型(如字符串)
- 尝试传入不同类型(如数字)
- 观察是否返回异常数据
案例:某系统studentid应为字符串类型,但传入数字时返回所有数据
防御措施:
- 严格类型检查
- 输入参数验证
- 类型转换时添加边界检查
5. 无身份参数的查询功能越权
原理:查询功能缺少身份参数,但响应中包含用户ID。
测试方法:
- 观察响应中的用户ID字段
- 尝试将该ID作为请求参数添加
- 修改为其他用户ID测试
示例:
- 正常请求无ID参数
- 添加
id=123参数获取自己数据 - 修改为
id=124尝试获取他人数据
防御措施:
- 从会话中获取用户身份
- 避免使用客户端提供的ID参数
- 实施数据访问控制层
6. 修改接口的越权
6.1 关键字替换越权
原理:使用current、me、my等关键字可能被替换为用户ID。
测试方法:
- 找到使用关键字的请求(如
/api/user/current) - 尝试替换为数字ID(如
/api/user/1234) - 验证是否能获取/修改他人数据
6.2 老接口越权
原理:历史遗留接口可能缺乏现代安全措施。
测试方法:
- 尝试访问旧版本API
- 检查API文档中的历史端点
- 使用目录爆破工具发现旧接口
6.3 增删改查接口不全
原理:当功能界面只暴露部分CRUD接口时,其他接口可能未受保护。
测试方法:
- 观察现有接口命名模式
- 猜测缺失的CRUD接口(如只有
addeval,尝试deleval、edieval等) - 直接访问猜测的接口测试
案例:某系统只有addeval接口,但猜测deleval后成功越权
防御措施:
- 统一的API网关和权限控制
- 禁用未使用的HTTP方法
- 实施全面的接口测试
总结
越权漏洞的核心在于系统未能正确验证用户对数据的访问权限。测试时应重点关注:
- 参数的可预测性和可遍历性
- 异常输入的处理逻辑
- 接口的完整性和一致性
- 身份验证机制的全面性
防御越权漏洞需要实施"最小权限原则",确保每个请求都经过适当的权限验证,并且用户只能访问自己有权限的数据。