越权漏洞

权限绕过漏洞

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

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

形成原因

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

漏洞分类

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

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

  • 水平越权和垂直越权的定义不一样,但漏洞原理是一样的,都是在判断权限时不严格导致存在绕过漏洞,这一类的绕过通常发生在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 用户的信息,因为 lucylili 输入同一级别用户,所以存在水平越权漏洞。

部分关键代码

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

posted @ 2023-10-20 19:14  Mr-Ryan  阅读(259)  评论(0编辑  收藏  举报