越权漏洞
over permission
水平越权
用户1可以在自己的登录状态下访问用户2的隐私信息
在pikachu靶场中,我们使用lucy的账号首先登录
发现url里面有一个"username=lucy",把值改为kobe然后执行
发现kobe的隐私信息也可以被访问
前端逻辑:
<form class="msg1" method="get">
<input type="hidden" name="username" value="lucy" />
<input type="submit" name="submit" value="点击查看个人信息" />
</form>
后端逻辑:
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
可见后端是通过前端提交的get方法中的username来决定是否查询数据库还有查询谁的数据库,也就是说,只要前端username不为空就查,只要库里有username的值就返回查询结果
发生这种漏洞的原因是网站开发人员对于用户的过度信任,开发人员认为用户只会在自己登录后的页面上点击
但是用户稍微了解一下url的知识就有可能在url行中把username改成其他用户名
此时就发生了水平越权漏洞
为啥叫"水平",个人理解是两个发生在两个平级用户账号(在本靶场中表现为两个普通用户)之间的漏洞,
相对于"垂直",垂直应该发生在管理员和普通用户之间,推测是普通用户可以利用漏洞访问管理员的隐私,或者做一些只有管理员才可以的操作
垂直越权
首先使用管理员admin账号登录
然后用普通用户登录
我猜此处"垂直越权"就是虽然普通用户虽然看起来"只有查看权限",但是可以通过提交管理员添加用户的表单也可以实现添加用户功能
以管理员登录时,我们发现删除操作实际是指定要删除记录的id然后以get方法发送给后端op2.admin.php文件
我们以普通用户pikachu登录然后再url行最后也这样写却直接掉线了,查阅后端代码发现确实此处有权限检查
$link=connect();
// 判断是否登录,没有登录不能访问
//如果没登录,或者level不等于1,都就干掉
if(!check_op2_login($link) || $_SESSION['op2']['level']!=1){
header("location:op2_login.php");
exit();
}
//删除
if(isset($_GET['id'])){
$id=escape($link, $_GET['id']);//转义
$query="delete from member where id={$id}";
execute($link, $query);
}
管理员还有一个注册新用户的功能,以管理员登录查看前端代码
<p class="edit_title">hi,admin,欢迎来到后台管理中心 | <a style="color:bule;" href="op2_admin_edit.php?logout=1">退出登录</a>|<a href="op2_admin.php">回到admin</a></p>
<form class="from_main" method="post">
<label>用户:<br /><input type="text" name="username" placeholder="必填"/></label><br />
<label>密码:<br /><input type="password" name="password" placeholder="必填"/></label><br />
<label>性别:<br /><input type="text" name="sex" /></label><br />
<label>电话:<br /><input type="text" name="phonenum" /></label><br />
<label>邮箱:<br /><input type="text" name="email" /></label><br />
<label>地址:<br /><input type="text" name="address" /></label><br />
<input class="sub" type="submit" name="submit" value="创建" />
</form>
发现是一个post表单,猜测发送给后端的op2_admin_edit.php
现在用普通用户登录然后将
http://127.0.0.1/pikachu/vul/overpermission/op2/op2_user.php
改为
http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php
发现我们可以访问该页面进行新建用户
查看后端代码
$link=connect();
// 判断是否登录,没有登录不能访问
//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
if(!check_op2_login($link)){
header("location:op2_login.php");
exit();
}
if(isset($_POST['submit'])){
if($_POST['username']!=null && $_POST['password']!=null){//用户名密码必填
$getdata=escape($link, $_POST);//转义
$query="insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['address']}')";
$result=execute($link, $query);
if(mysqli_affected_rows($link)==1){//判断是否插入
header("location:op2_admin.php");
}else {
$html.="<p>修改失败,请检查下数据库是不是还是活着的</p>";
}
}
}
确实没有检查权限等级