src/众测中的一些越权方式
字数 1701 2025-08-30 06:50:27

众测中的常见越权方式详解

1. 参数可遍历越权

原理:当接口参数为数字类型时,通过遍历参数值可能获取到其他用户的数据。

常见场景

  • 用户ID、订单ID等数字型参数
  • 分页参数、序号等可预测的参数

测试方法

  • 修改数字参数为相邻值(如自己的ID是123,尝试124、125等)
  • 使用Burp Suite的Intruder模块进行批量测试

案例:xx科学院大学某接口存在数字ID遍历越权

防御措施

  • 实施严格的权限验证
  • 使用不可预测的UUID替代连续数字ID
  • 记录和监控异常访问模式

2. 参数不可遍历越权

原理:当参数不可预测时,通过注册多个账号并替换参数测试越权可能性。

测试方法

  1. 注册两个测试账号A和B
  2. 用账号A获取正常请求
  3. 替换关键参数为账号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. 参数类型越权

原理:当参数类型处理不当时,传入错误类型可能导致全表查询。

测试方法

  1. 确认参数原始类型(如字符串)
  2. 尝试传入不同类型(如数字)
  3. 观察是否返回异常数据

案例:某系统studentid应为字符串类型,但传入数字时返回所有数据

防御措施

  • 严格类型检查
  • 输入参数验证
  • 类型转换时添加边界检查

5. 无身份参数的查询功能越权

原理:查询功能缺少身份参数,但响应中包含用户ID。

测试方法

  1. 观察响应中的用户ID字段
  2. 尝试将该ID作为请求参数添加
  3. 修改为其他用户ID测试

示例

  • 正常请求无ID参数
  • 添加id=123参数获取自己数据
  • 修改为id=124尝试获取他人数据

防御措施

  • 从会话中获取用户身份
  • 避免使用客户端提供的ID参数
  • 实施数据访问控制层

6. 修改接口的越权

6.1 关键字替换越权

原理:使用currentmemy等关键字可能被替换为用户ID。

测试方法

  1. 找到使用关键字的请求(如/api/user/current
  2. 尝试替换为数字ID(如/api/user/1234
  3. 验证是否能获取/修改他人数据

6.2 老接口越权

原理:历史遗留接口可能缺乏现代安全措施。

测试方法

  • 尝试访问旧版本API
  • 检查API文档中的历史端点
  • 使用目录爆破工具发现旧接口

6.3 增删改查接口不全

原理:当功能界面只暴露部分CRUD接口时,其他接口可能未受保护。

测试方法

  1. 观察现有接口命名模式
  2. 猜测缺失的CRUD接口(如只有addeval,尝试delevaledieval等)
  3. 直接访问猜测的接口测试

案例:某系统只有addeval接口,但猜测deleval后成功越权

防御措施

  • 统一的API网关和权限控制
  • 禁用未使用的HTTP方法
  • 实施全面的接口测试

总结

越权漏洞的核心在于系统未能正确验证用户对数据的访问权限。测试时应重点关注:

  1. 参数的可预测性和可遍历性
  2. 异常输入的处理逻辑
  3. 接口的完整性和一致性
  4. 身份验证机制的全面性

防御越权漏洞需要实施"最小权限原则",确保每个请求都经过适当的权限验证,并且用户只能访问自己有权限的数据。

众测中的常见越权方式详解 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方法 实施全面的接口测试 总结 越权漏洞的核心在于系统未能正确验证用户对数据的访问权限。测试时应重点关注: 参数的可预测性和可遍历性 异常输入的处理逻辑 接口的完整性和一致性 身份验证机制的全面性 防御越权漏洞需要实施"最小权限原则",确保每个请求都经过适当的权限验证,并且用户只能访问自己有权限的数据。