WebSec-Over Permission

1. 关于越权

两种,水平越权和垂直越权。

一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方。

后台权限管理中应该遵守:

  1. 使用最小权限原则对用户进行赋权;

  2. 使用合理(严格)的权限校验规则;

  3. 使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;


后台检查登录状态不够严谨,可能导致越权。

挖掘方法:

  • 登录后,增删改查操作抓一下包,修改用户名试试;
  • 分析管理员操作的数据包,尝试使用普通用户(的会话)来操作。

防范:

  • 针对水平越权,要注意使用会话检查请求的值,跟登录态关系进行绑定;
  • 针对垂直越权,要注意检查权限级别。

总之,增删改查要检查好权限。

2. 靶场练习

2.1 pikachu

水平越权

登录页面(op1_login.php)提示可以登录这么几个账户:

lucy/123456
lili/123456
kobe/123456

登录lucy后有个按钮查看个人信息,是个get请求,url为:

http://10.10.10.133/pk/vul/overpermission/op1/op1_mem.php?username=lili&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF

把username改成lili和kobe,都可以成功获取信息。

看下op1_login.php的源码:

$link=connect();

//判断是是否登录,如果已经登录,点击时,直接进入会员中心
if(check_op_login($link)){
    header("location:op1_mem.php");		// 已经登录为lucy了, 越权时会执行这里
}


$html='';
if(isset($_POST['submit'])){
    if($_POST['username']!=null && $_POST['password']!=null){
        $username=escape($link, $_POST['username']);
        $password=escape($link, $_POST['password']);//转义,防注入
        $query="select * from member where username='$username' and pw=md5('$password')";
        $result=execute($link, $query);
        if(mysqli_num_rows($result)==1){
            $data=mysqli_fetch_assoc($result);
            $_SESSION['op']['username']=$username;					// lucy
            $_SESSION['op']['password']=sha1(md5($password));
            header("location:op1_mem.php");
        }else{
            $html.="<p>登录失败,请重新登录</p>";
        }

    }

}

重定向后的op1_mem.php源码:

$link=connect();
// 判断是否登录,没有登录不能访问
if(!check_op_login($link)){
    header("location:op1_login.php");
}
$html='';
if(isset($_GET['submit']) && $_GET['username']!=null){	// 可以在这里检查一下$_GET['username']==$_SESSION['op']['username']
    //没有使用session来校验,而是使用的传进来的值,权限校验出现问题,这里应该跟登录态关系进行绑定
    $username=escape($link, $_GET['username']);
    // $username=escape($link, $_SESSION['op']['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
<div id="per_info">
   <h1 class="per_title">hello,{$uname},你的具体信息如下:</h1>
   <p class="per_name">姓名:{$uname}</p>
   <p class="per_sex">性别:{$sex}</p>
   <p class="per_phone">手机:{$phonenum}</p>    
   <p class="per_add">住址:{$add}</p> 
   <p class="per_email">邮箱:{$email}</p> 
</div>
A;
    }
}

垂直越权

提示这里有两个用户:

admin/123456
pk/000000
admin是超级boss

登录admin后,主要的交互按钮有查看用户列表(默认,op2_admin.php)、添加用户(op2_admin_edit.php)、删除用户(op2_admin.php?id=25)。

登录pk后,则只有查看用户的权限(op2_user.php)。

现在重新登录admin,将添加和删除操作用bp抓包并发到repeater,再登录到pk,只需要把admin数据包的phpsessionid替换成pk的,就可以添加用户了。但是删除用户没有成功(id存在)。

看下op2_login.php登录源码:

$link=connect();

$html="";
if(isset($_POST['submit'])){
    if($_POST['username']!=null && $_POST['password']!=null){
        $username=escape($link, $_POST['username']);
        $password=escape($link, $_POST['password']);//转义,防注入
        $query="select * from users where username='$username' and password=md5('$password')";
        $result=execute($link, $query);
        if(mysqli_num_rows($result)==1){
            $data=mysqli_fetch_assoc($result);
            if($data['level']==1){//如果级别是1,进入admin.php
                $_SESSION['op2']['username']=$username;
                $_SESSION['op2']['password']=sha1(md5($password));
                $_SESSION['op2']['level']=1;
                header("location:op2_admin.php");
            }
            if($data['level']==2){//如果级别是2,进入user.php
                $_SESSION['op2']['username']=$username;
                $_SESSION['op2']['password']=sha1(md5($password));
                $_SESSION['op2']['level']=2;
                header("location:op2_user.php");
            }

        }else{
            //查询不到,登录失败
            $html.="<p>登录失败,请重新登录</p>";
        }
    }
}

会话中给登录用户设置了level,区分用户级别。

然后看下管理员相关的逻辑。

op2_admin.php中,登录时会检查级别,所以刚刚删除用户失败,good。

$link=connect();
// 判断是否登录,没有登录不能访问
//如果没登录,或者level不等于1,都就干掉
if(!check_op2_login($link) || $_SESSION['op2']['level']!=1){
    header("location:op2_login.php");
    exit();
}

但是op2_admin_edit.php中,没有检查级别,所以可以用用户pk的会话添加用户:

// 判断是否登录,没有登录不能访问
//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
if(!check_op2_login($link)){
    header("location:op2_login.php");
    exit();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值