越权漏洞

发布时间 2023-10-20 19:16:37作者: Mr-Ryan

权限绕过漏洞

权限绕过(也叫越权)漏洞是指攻击者通过利用系统或应用程序中的漏洞,绕过了正常的权限控制机制,获得了比他们应该具有的更高权限。

  • 可以通过越权漏洞访问他人信息或者操纵他人账号
  • 其中权限绕过又有水平越权和垂直越权两种

形成原因

形成的原因:主要是因为开发人员对数据的增、删、改、查时对客户端请求的数据过分相信而遗漏了权限的判定。

漏洞分类

  • 水平越权:相同级别(权限)的用户或者同一角色中不同的用户之间,可以越权访问、修改或者删除其他用户信息的非法操作。如果出现此漏洞,可能会造成大批量数据的泄露,严重的甚至会造成用户信息被恶意篡改。

  • 垂直越权:就是不同级别之间的用户或不同角色之间用户的越权,比如普通用户可以执行管理员才能执行的功能。

  • 水平越权和垂直越权的定义不一样,但漏洞原理是一样的,都是在判断权限时不严格导致存在绕过漏洞,这一类的绕过通常发生在cookie验证不严、简单判断用户提交的参数,归根结底,都是因为这些参数是在客户端提交,服务端未严格校验。

  • 举例:当前A用户查看自己详细订单的URL为 /1.php?ordered=111,当用户手动提交 /1.php?ordered=112 时,则可以看到订单为112的别人的订单情况.

pikachu靶场越权漏洞

概述

  • 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
  • 一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。
  • 因此,在在权限管理中应该遵守:
    • 1.使用最小权限原则对用户进行赋权;
    • 2.使用合理(严格)的权限校验规则;
    • 3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

水平越权

  1. 根据提示信息,登录 lucy 账号
  2. 查看个人信息

    发现查看个人信息是通过 get 方式传递 username 参数,那能不能修改 username 参数的值来查看别人的信息呢?
  3. 尝试修改 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']);
    }


看看防御效果

  1. 登录 lucy 用户,并查看个人信息
  2. 修改url中usernmae参数的值为lili

    跳转到查看个人信息界面
  3. 点击查看个人信息

    发现查看的依然还是lucy用户的信息,防御成功。

垂直越权

  1. 点击提示,发现有两个用户,pikachu 用户为普通用户,admin 用户为超级用户
  2. 登录 pikachu 用户,发现只有查看权限
  3. 再登录 admin 用户

    发现可以查看、添加、删除
    查看功能的url如下:
    http://www.pikachu.test/vul/overpermission/op2/op2_admin.php
    
    添加用户功能的url如下:
    http://www.pikachu.test/vul/overpermission/op2/op2_admin_edit.php
    

    删除用户功能的url如下:
    http://www.pikachu.test/vul/overpermission/op2/op2_admin.php?id=25
    
  4. 再次登录pikachu用户
  5. 输入查看用户功能的url

    提示需要登录,说明此处不存在越权漏洞
  6. 输入添加用户的url

    发现可以进入,创建一个用户试试
  7. 登录admin用户查看是否创建成功

    发现创建成功,说明此处存在垂直越权漏洞
  8. 删除页面是每删除一个,url的id值就加一。
    http://www.pikachu.test/vul/overpermission/op2/op2_admin.php?id=25
    

    登录pikachu 用户,访问删除用户的链接,删除aaa 用户试试看,对应的id为25

    发现会跳转到登录页面,登录 admin 用户,看看 aaa 用户是否被删除成功

    发现并没有被删除,说明该功能点不存在越权漏洞。

以上,说明只有添加用户功能存在垂直越权。

使用burp进行尝试

  1. 使用burp抓取 admin 添加用户的数据包

    然后发送到重放模块
  2. 然后抓一下pikachu用户登录的数据包

    同样发送到重放模块
  3. 将 admin 添加用户的URL以及请求正文复制到 pikachu 登录的数据包中(或者直接用 pikachu 登录数据包中的 Cookie 值替换admin 添加用户数据包中的 Cookie 值)

    然后发送数据包,出现 302 跳转,不用管
  4. 回到浏览器,登录 admin 用户,检查 bbb 用户是否添加成功

    发现 bbb 用户添加成功,说明存在垂直越权漏洞。

查看源码

先看没问题的删除操作 op2_admin.php

主要是23~26行,判断了用户是否登录,是否权限级别为1(超级boss),如果任意一条不满足,就跳转到登录页面。

再来看看有问题的op2_admin_edit.php:

22~25行,这里只是验证了登录状态,并没有验证级别,所以存在越权问题。

防御

仿照删除操作的代码,增加对用户权限等级的判断$_SESSION['op2']['level']!=1