越权漏洞
权限绕过漏洞
权限绕过(也叫越权)漏洞是指攻击者通过利用系统或应用程序中的漏洞,绕过了正常的权限控制机制,获得了比他们应该具有的更高权限。
- 可以通过越权漏洞访问他人信息或者操纵他人账号
- 其中权限绕过又有水平越权和垂直越权两种
形成原因
形成的原因:主要是因为开发人员对数据的增、删、改、查时对客户端请求的数据过分相信而遗漏了权限的判定。
漏洞分类
-
水平越权:相同级别(权限)的用户或者同一角色中不同的用户之间,可以越权访问、修改或者删除其他用户信息的非法操作。如果出现此漏洞,可能会造成大批量数据的泄露,严重的甚至会造成用户信息被恶意篡改。
-
垂直越权:就是不同级别之间的用户或不同角色之间用户的越权,比如普通用户可以执行管理员才能执行的功能。
-
水平越权和垂直越权的定义不一样,但漏洞原理是一样的,都是在判断权限时不严格导致存在绕过漏洞,这一类的绕过通常发生在cookie验证不严、简单判断用户提交的参数,归根结底,都是因为这些参数是在客户端提交,服务端未严格校验。
-
举例:当前A用户查看自己详细订单的URL为
/1.php?ordered=111
,当用户手动提交/1.php?ordered=112
时,则可以看到订单为112的别人的订单情况.
pikachu靶场越权漏洞
概述
- 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
- 一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。
- 因此,在在权限管理中应该遵守:
- 1.使用最小权限原则对用户进行赋权;
- 2.使用合理(严格)的权限校验规则;
- 3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;
水平越权
- 根据提示信息,登录
lucy
账号
- 查看个人信息
发现查看个人信息是通过get
方式传递username
参数,那能不能修改username
参数的值来查看别人的信息呢?
- 尝试修改
username
参数的值,将其修改为lili
如图,发现已经成功显示lili
用户的信息,因为lucy
和lili
输入同一级别用户,所以存在水平越权漏洞。
部分关键代码
op1_mem.php
$link=connect();
// 判断是否登录,没有登录不能访问
if(!check_op_login($link)){
header("location:op1_login.php");
}
$html='';
if(isset($_GET['submit']) && $_GET['username']!=null){
//没有使用session来校验,而是使用的传进来的值,权限校验出现问题,这里应该跟登录态关系进行绑定
$username=escape($link, $_GET['username']);
$query="select * from member where username='$username'";
$result=execute($link, $query);
if(mysqli_num_rows($result)==1){
$data=mysqli_fetch_assoc($result);
$uname=$data['username'];
$sex=$data['sex'];
$phonenum=$data['phonenum'];
$add=$data['address'];
$email=$data['email'];
$html.=<<<A
查找用户信息的时候传入的参数是直接从url中获取的,没有校验当前用户。
防御
既然没有检验,我们就给他添加一个简单的验证,在27行增加判断url传入的username
和当前用户是否匹配,如果匹配则为$username
赋值,若不匹配则不赋值。
if($_SESSION['op']['username']==$_GET['username']){
$username=escape($link,$_GET['username']);
}
看看防御效果
- 登录
lucy
用户,并查看个人信息
- 修改url中
usernmae
参数的值为lili
跳转到查看个人信息界面 - 点击查看个人信息
发现查看的依然还是lucy
用户的信息,防御成功。
垂直越权
- 点击提示,发现有两个用户,
pikachu
用户为普通用户,admin
用户为超级用户
- 登录
pikachu
用户,发现只有查看权限
- 再登录
admin
用户
发现可以查看、添加、删除
查看功能的url如下:
添加用户功能的url如下:http://www.pikachu.test/vul/overpermission/op2/op2_admin.php
http://www.pikachu.test/vul/overpermission/op2/op2_admin_edit.php
删除用户功能的url如下:http://www.pikachu.test/vul/overpermission/op2/op2_admin.php?id=25
- 再次登录
pikachu
用户
- 输入查看用户功能的url
提示需要登录,说明此处不存在越权漏洞 - 输入添加用户的url
发现可以进入,创建一个用户试试
- 登录
admin
用户查看是否创建成功
发现创建成功,说明此处存在垂直越权漏洞 - 删除页面是每删除一个,url的id值就加一。
http://www.pikachu.test/vul/overpermission/op2/op2_admin.php?id=25
登录pikachu
用户,访问删除用户的链接,删除aaa
用户试试看,对应的id为25
发现会跳转到登录页面,登录admin
用户,看看aaa
用户是否被删除成功
发现并没有被删除,说明该功能点不存在越权漏洞。
以上,说明只有添加用户功能存在垂直越权。
使用burp进行尝试
- 使用burp抓取
admin
添加用户的数据包
然后发送到重放模块 - 然后抓一下
pikachu
用户登录的数据包
同样发送到重放模块 - 将
admin
添加用户的URL以及请求正文复制到pikachu
登录的数据包中(或者直接用pikachu
登录数据包中的Cookie
值替换admin
添加用户数据包中的Cookie
值)
然后发送数据包,出现302
跳转,不用管 - 回到浏览器,登录
admin
用户,检查bbb
用户是否添加成功
发现bbb
用户添加成功,说明存在垂直越权漏洞。
查看源码
先看没问题的删除操作 op2_admin.php
主要是23~26行,判断了用户是否登录,是否权限级别为1(超级boss),如果任意一条不满足,就跳转到登录页面。
再来看看有问题的op2_admin_edit.php
:
22~25行,这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
防御
仿照删除操作的代码,增加对用户权限等级的判断$_SESSION['op2']['level']!=1