1. 越权漏洞的定义
越权漏洞(Privilege Escalation)是指系统未能正确验证用户权限,导致攻击者能够执行超出其权限范围的操作。这种逻辑漏洞源于服务器对客户端请求的过度信任,缺乏严格的权限校验机制。
越权漏洞就像小区门禁系统出了bug。想象一下:你拿着普通住户的门禁卡,本来只能进自己家和健身房,结果有一天你发现:
- 用你的卡居然能刷开邻居家的门(这就是水平越权)
- 甚至还能打开物业办公室(这就是垂直越权)
这明显不正常对吧?网站和APP也会出现这种问题。比如:
• 你改一下网址里的订单编号,就能看到别人的购物记录
• 普通用户点个按钮,居然能删除网站所有内容
出现这种情况,都是因为程序员忘记做"查证件"这一步,系统看到有人敲门就直接放行了,根本不检查来的人到底有没有权限做这个操作。
要防止这种漏洞,关键是要做到:每次有人要操作时,系统都要先确认"这个人真的有权限做这件事吗?"就像小区门卫应该认真核对每张门禁卡的权限一样。
2. 分类与危害分析
3. 一般攻击手法详解
① GET参数篡改
原始请求:GET /userinfo?id=123
攻击请求:GET /userinfo?id=456(遍历ID获取他人信息)
*防御方案*:服务端校验session与ID绑定关系
② POST参数伪造
{
“userId”: “123”, // 修改为其他用户ID
“operation”: “delete”
}
*防御方案*:使用JWT等token机制替代明文参数
③ Cookie劫持
document.cookie=“admin_token=xxxx” // 窃取高权限cookie
*防御方案*:HttpOnly+Secure属性+定期刷新
4.靶场练习-Pikachu靶场
(1)水平越权——漏洞复现步骤:
登录到Pikachu靶场
打开越权靶场测试
可以点击这边的提示一下,可以看到这边有3个账户
使用 lucy 登录系统
进入 "查看用户信息" 页面,URL可能类似:
http://127.0.0.1/pikachu/vul/overpermission/op1/op1_mem.php?username=lucy&submit=点击…
观察URL中的参数 username=lucy,此时页面显示 lucy 的信息。
修改参数:将 username=lucy 改为 username=lili(或其他用户的ID),刷新页面。
如果页面显示 lili 的信息,说明存在水平越权漏洞(因为我们并没有登录lili,而通过修改参数对lili进行了访问)
(2)垂直越权——漏洞复现步骤:
1.切换到垂直越权,点击提示,发现有两个用户, pikachu 用户为普通用户, admin 用户为超级用户
2. 登录 普通用户Pikachu,密码000000 发现只有查看权限
3.退出,登录管理员账户,账户admin,密码123456
发现可以有查看、添加、删除功能
把鼠标放在删除按钮上时左下角出现url
查看功能的url如下:
127.0.0.1/pikachu/vul/overpermission/op2/op2_admin.php
添加用户功能的url如下:
127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php
删除用户功能的url如下:
127.0.0.1/pikachu/vul/overpermission/op2/op2_admin.php?id=5
4.退出管理员,再次登录pikachu 用户,注意url
5. 直接在浏览器输入添加用户功能的url
6.发现可以进入,创建一个用户试试
7.发现创建成功,说明此处存在垂直越权漏洞
其他功能点同理,逐一尝试,若输入相应的url后跳转到需要登录的页面,则该功能点不存在垂直越权漏洞
工具辅助验证(Burp Suite)
用Burp拦截查看用户信息的请求。
修改请求中的username参数,观察服务器返回结果
5. 漏洞修复
1、完善用户权限体系。要知道哪些数据对于哪些用户,哪些数据不应该由哪些用户操作;
2、鉴权,服务端对请求的数据和当前用户身份做校验;
3、不要直接使用对象的实名或关键字;
4、对于可控参数进行严格的检查与过滤。
注意事项
仅在授权环境中测试,勿在真实网站尝试。
使用Burp Suite或Postman拦截请求时,注意观察HTTP头部的权限验证字段。