未授权、越权类漏洞探究
字数 1298 2025-08-27 12:33:48
未授权与越权类漏洞深度探究
0x01 前言
权限类漏洞在当今Web安全领域日益重要,OWASP TOP10的变化也反映了这一趋势:注入漏洞已降至第三位,而访问控制类漏洞变得更加普遍。本文将从技术角度深入探讨未授权访问和越权访问两类漏洞的原理、挖掘方法和防御措施。
0x02 未授权访问漏洞
基本概念
未授权访问漏洞指系统功能本应经过认证才能访问,但攻击者通过技术手段绕过认证机制直接访问的情况。这类漏洞可分为两类:
- 组件类未授权:如Redis、MongoDB等服务的未授权访问
- WEB应用层未授权:如CMS系统的未授权文件上传、账号创建等
Cookie机制与认证
HTTP协议本身是无状态的,需要通过以下机制维持会话状态:
- Cookie:存储在客户端的加密字符串,用于身份识别
- Auth认证:如Basic Auth、Digest Auth等
- JWT:JSON Web Token认证机制
漏洞挖掘方法
基本测试流程
- 记录正常认证后的操作流程和数据包
- 删除或修改认证因子(Cookie/Auth头/JWT等)
- 对比处理前后的响应差异
自动化测试工具
推荐使用Burp Suite插件burp-unauth-checker进行自动化测试,或使用Burp的Match/Replace功能:
- 在Burp中配置规则:
- Match:
Cookie:.* - Replace:
Cookie: invalid_cookie=1
- Match:
- 观察修改后的请求是否仍能获得相同响应
代码层面分析
以某OA系统为例,典型的鉴权实现:
// auth.inc.php
session_start();
if(!isset($_SESSION['userid'])) {
header("Location: login.php");
exit;
}
// 需要鉴权的文件
require_once('auth.inc.php');
// 后续业务逻辑...
0x03 越权访问漏洞
基本概念与分类
- 水平越权:相同权限用户间的越权操作
- 垂直越权:低权限用户执行高权限操作
漏洞挖掘方法
类型一:未使用Cookie鉴权
测试步骤:
- 全局搜索
userid、id、countid等参数 - 修改参数值为其他用户的标识
- 观察是否能获取/修改其他用户数据
典型案例:
GET /api/userinfo?userid=123 HTTP/1.1
Host: example.com
Cookie: PHPSESSID=abc123
修改userid参数即可获取其他用户信息
类型二:使用Cookie鉴权但权限校验不严
场景一:拥有两个账号
- 使用管理员账号操作并抓包
- 替换Cookie为普通用户Cookie
- 重放请求观察是否成功
场景二:仅有一个普通账号
- 通过JS文件、Swagger等发现隐藏API
- 构造请求尝试越权操作
- 根据错误信息调整参数
典型测试流程:
POST /api/updateUser HTTP/1.1
Host: example.com
Cookie: PHPSESSID=普通用户session
Content-Type: application/json
{
"userid": "admin",
"newRole": "superadmin"
}
高级挖掘技巧
- 参数FUZZ:对关键参数进行模糊测试
- 状态码分析:关注403/401与200的差异
- 业务逻辑分析:理解业务流程中的权限校验点
0x04 防御措施
通用防御方案
-
认证检查:
- 所有敏感操作前验证会话有效性
- 使用框架提供的认证中间件
-
权限验证:
- 操作前验证用户权限是否匹配
- 实施RBAC(基于角色的访问控制)模型
代码实现示例
// 检查是否登录
function checkLogin() {
if(empty($_SESSION['userid'])) {
die(json_encode(['code'=>401, 'msg'=>'未登录']));
}
}
// 检查权限
function checkPermission($requiredRole) {
$userRole = getUserRole($_SESSION['userid']);
if($userRole < $requiredRole) {
die(json_encode(['code'=>403, 'msg'=>'权限不足']));
}
}
// 业务接口
function updateUser() {
checkLogin();
checkPermission(ROLE_ADMIN);
$targetUserId = $_POST['userid'];
// 额外验证:当前用户是否有权操作目标用户
if(!canOperateUser($_SESSION['userid'], $targetUserId)) {
die(json_encode(['code'=>403, 'msg'=>'无权操作该用户']));
}
// 安全通过后执行业务逻辑
// ...
}
0x05 总结
权限类漏洞在实际渗透测试中非常常见,危害性往往被低估。有效的防御需要:
- 在所有敏感操作前实施双重验证(认证+权限)
- 遵循最小权限原则
- 对用户输入进行严格的权限归属验证
- 定期进行权限专项审计
通过系统化的权限控制设计和严格的代码实现,才能有效防范未授权和越权类安全风险。