水平越权与垂直越权
越权漏洞简介
越权,顾名思义,就是超出了权限或权力范围。多数WEB应用都具备权限划分和控制,但是如果权限控制功能设计存在缺陷,那么攻击者就可以通过这些缺陷来访问未经授权的功能或数据,这就是我们通常说的越权漏洞。攻击者越权后就可以进行一些操作,例如查看敏感信息、进行一些增删改查的
操作等等。
越权漏洞是一种很常见的逻辑安全漏洞。是由于服务器端对客户提出的数据操作请求过分信任,忽略了对该用户操作权限的判定,导致修改相关参数就可以拥有了其他账户的增、删、查、改功能,从而导致越权漏洞。
水平越权
概念
水平越权指的是攻击者尝试访问与他拥有相同权限的用户的资源,怎么理解呢?比如某系统中有个人资料这个功能,A账号和B账号都可以访问这个功能,但是A账号的个人信息和B账号的个人信息不同,可以理解为A账号和B账号个人资料这个功能上具备水平权限的划分。此时, A账号通过攻击手段访问了B账号的个人资料,这就是水平越权漏洞。
说人话就是平民之间的明争暗斗。
常见场景
1、基于用户身份的ID
在使用某个功能时通过用户提交的身份ID (用户ID、账号、手机号、证件号等用户唯一标识)来访问或操作对应的数据。
2、基于对象ID
在使用某个功能时通过用户提交的对象ID (如订单号、记录号)来访问或操作对应的数据。
3、基于文件名
在使用某个功能时通过文件名直接访问文件,最常见于用户上传文件的场景。
实例
实验环境为 pikachu 靶场 over permission 模块水平越权
我们已事先知道三个账号:
lucy/123456
lili/123456
kobe/123456
怎么实现水平越权呢?首先我们随便登录一个账号,比如 lucy,同时抓包,发现显示了 username & password
放包肯定是能登陆上去的。那我们把 username 改成 kobe 或者 lili 后放包呢?
放包发现成功登陆了 kobe 的账户
这就成功实现了水平越权。想想看,你作为一个平民玩家,随便改了个 id 就掌握了其他平民(甚至可能是氪金大佬)的信息,岂不是…
我们做点更坏的事,能不能顺带把 kobe 的密码也一块改了呢?
放包,发现登录失败。刷新一下,用设置的密码登录,还是失败,说明此处是不能通过水平越权更改其他用户的信息的。
垂直越权
概念
垂直越权是不同级别之间或不同角色之间的越权,垂直越权还可以分为向上越权和向下越权。向上越权指的是一个低级别用户尝试访问高级别用户的资源,比如说某个系统分为普通用户和管理员用户,管理员有系统管理功能,而普通用户没有,那我们就可以理解成管理功能具备垂直权限划分,如果普
通用户能利用某种攻击手段访问到管理功能,那我们就称之为向上越权(就是以下犯上)。向下越权是一个高级别用户访问低级别用户信息(那这也是不行的,我们每个人都要有私生活和小秘密)。
常见场景
1、未认证账户访问无需认证就能访问该功能
2、不具备某个功能权限的账户认证后成功访问该功能
实例
实验环境为 pikachu 靶场 over permission 模块垂直越权
我们已事先知道两个账号:
admin/123456
pikachu/000000
admin是超级boss(管理员)
先分别登录看看,再确定出题人想要我们实现的是向上越权还是向下越权
首先是admin
再是pikachu
发现唯一的不同是管理员账户多了一个添加用户的功能。猜测此处是要不使用管理员账户来获取添加用户的功能。
我们先在登录 pikachu 的时候抓个包看看能不能更改 admin 的密码
发现登录失败,说明通过普通用户改管理员密码是不行的
经过排查初步确定是添加用户这个板块存在越权了,url是
http://192.168.244.1/pikachu/vul/overpermission/op2/op2_admin_edit.php
查看 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>";
}
}
}
发现只判断了是否登陆,没有验证级别,确实存在越权
如何实现越权呢?我们只需要重新登入这个板块,把url改成
http://192.168.244.1/pikachu/vul/overpermission/op2/op2_admin_edit.php即可
这样,即使不登陆管理员账户,也可以添加用户