什么是越权漏洞?如何验证。
什么是越权漏洞?
越权(Privilege Escalation)是指用户或系统在未获得授权的情况下,通过非法手段访问或操作超出其权限范围的资源或执行未授权的操作。这一问题本质上属于访问控制缺陷,其核心在于授权验证机制的失效。
越权漏洞主要分为两类:水平越权和垂直越权,下面将详细介绍。
一、越权的定义与分类
水平越权
指同一权限等级的用户能够访问或操作其他用户的数据或资源。
常见示例:
- 普通用户通过修改URL参数(如
accountId=123456
)查看其他用户的账户信息 - 在电商平台中,用户A通过某种方式访问了用户B的订单详情
常见原因:
- 权限验证不足(如仅依赖前端校验而非后端验证)
- 直接对象引用(Direct Object Reference),如通过URL参数直接暴露敏感ID
垂直越权
指低权限用户能够访问或操作高权限用户的资源或执行高权限操作。
常见示例:
- 普通用户通过构造特定请求调用管理员接口(如
/admin/deleteUser
)删除用户 - 普通用户通过修改
role
字段值从0(普通用户)变为1(管理员)实现权限提升
常见诱因:
- 多阶段功能验证不足(如找回密码功能仅验证前半段,未验证最终操作对象)
- 平台配置错误(如Web服务器控件未正确限制管理员路径访问)
二、越权漏洞的验证方法
验证越权漏洞需结合技术手段和业务逻辑分析,以下是具体方法:
1. 基础测试方法
双账号测试
使用两个不同权限的账号(如账号A和账号B)进行交叉操作测试。
测试步骤:
- 以账号A登录后,通过抓包工具(如Fiddler、Burp Suite)获取其Cookie
- 替换账号B的请求中的参数(如
userId
、orderId
等) - 观察是否能访问账号B的数据
- 若响应返回成功(如200状态码)且数据被修改,则存在越权漏洞
参数篡改测试
通过修改URL参数或请求体中的敏感字段(如accountId
、card_id
)测试是否能访问非预期资源。
测试示例:
- 在网银系统中,通过修改
accountId=123456
查看他人账户信息 - 在订单查询接口中,通过加减1测试
orderId
参数是否能访问他人订单
2. 高级测试方法
自动化测试工具
使用专用工具(如小米范越权漏洞检测工具)自动拦截请求并分析权限异常。
测试要点:
- 将测试账号的Cookie复制到目标账号的请求中,若未被拦截则可能存在越权
- 通过工具对比不同权限账号的访问行为,识别权限边界漏洞
业务逻辑分析
重点关注场景:
- 上下文相关越权:针对依赖动态状态的场景(如密码重置、支付流程),验证是否因状态机漏洞导致权限绕过
- 多阶段功能验证:检查多步骤操作(如转账、修改密码)中是否存在未充分验证中间状态的漏洞
3. 验证步骤总结
- 识别潜在越权点:
- 重点关注涉及用户ID、角色ID、权限字段的接口(如
/user/info
、/order/detail
) - 分析业务逻辑中权限隔离薄弱的环节(如管理员与普通用户共用同一数据库表)
- 重点关注涉及用户ID、角色ID、权限字段的接口(如
- 执行越权测试:
- 使用两个不同权限的账号进行交叉操作测试,观察是否能访问非预期资源
- 通过修改请求参数(如
userId
、role
)测试是否能越权
- 结果验证:
- 若响应成功(如200状态码)且数据被修改,则确认越权漏洞存在
- 若响应失败(如403、302),则可能不存在漏洞
三、防御建议
严格权限验证
- 所有操作均需在服务器端验证用户权限,避免依赖前端校验
- 对敏感操作(如删除、修改)增加二次身份验证(如短信验证码)
加密与混淆
- 对直接对象引用(如
accountId
)进行加密处理,防止枚举攻击 - 使用随机UUID替代可预测的ID字段
日志与监控
- 记录关键操作的访问日志,及时发现异常行为
- 通过hook机制动态验证用户权限,防止越权
越权测试示例代码
# 水平越权测试示例 (Python)
import requestsdef test_horizontal_violation():# 普通用户账号normal_user = {"username": "user123","password": "password123"}# 管理员账号admin_user = {"username": "admin","password": "admin123"}# 登录普通用户login_url = "https://api.example.com/login"response = requests.post(login_url, json=normal_user)cookie = response.cookies.get_dict()# 尝试访问管理员数据target_url = "https://api.example.com/admin/data"headers = {"Cookie": f"session={cookie['session']}"}admin_response = requests.get(target_url, headers=headers)if admin_response.status_code == 200:print("发现水平越权漏洞!")print("普通用户可以访问管理员数据")print("响应内容:", admin_response.json())else:print("未发现水平越权漏洞")print("响应状态码:", admin_response.status_code)# 垂直越权测试示例 (JavaScript)
async function testVerticalViolation() {// 获取普通用户Cookieconst normalUserCookie = await getNormalUserCookie();// 构造管理员请求const adminRequest = {method: 'GET',url: 'https://api.example.com/api/v1/users/admin',headers: {'Cookie': normalUserCookie}};// 发送请求const response = await sendRequest(adminRequest);// 验证结果if (response.statusCode === 200) {console.log('发现垂直越权漏洞!');console.log('普通用户可以访问管理员数据:', response.body);} else {console.log('未发现垂直越权漏洞');console.log('响应状态码:', response.statusCode);}
}