我们主要是讲一下垂直越权是什么漏洞,首先我们把这个思路理一下,我们先用超级管理员账号登录一下,登录之后,我们对超级管理员独一无二的权限,比如添加账号,就是可以新增账号,这个操作,进行一个执行,执行之后,我们对新增账号的数据包,抓下来,抓下来之后,我们就退出超级管理员登录,退出之后,我们退换到普通管理员的权限,然后,我们把刚刚抓取到的数据包,用普通管理员身份进行一次重放,这个逻辑就是说,用普通管理员权限,操作了只有超级管理员才能做的操作,如果说,这个操作能够成功,那就意味着,后台存在垂直越权漏洞
常见越权漏洞演示:后台用户垂直越权
越权漏洞常见防范措施
使用高权限账号登录(比如管理员),然后执行一个其独有的权限操作,抓包;
出高权限账号,使用低权限账号登录;
在低权限账号下,重放该数据包(使用低权限账号的cookie);
重新使用高权限账号登录,确认低权限下的重放操作是否成功,如果成功,说明存在权限校验不足的越权漏洞;
首先,我们用超级管理员账号登录一下,admin,123456
登录之后,超级管理员有添加用户的权限
还可以查看用户列表
这里我们添加用户,随便写一个,后台也没做什么校验
点击创建
yyy这个用户被我们添加成功了,这是超级管理员的一个正常操作
我们把这个数据包,给抓下来
这个请求,就是,我们超级管理员添加用户的请求,我们把这个请求,发送到repeater去,这个时候去重放数据包,是可以成功的
我们回来,点退出登录
这个时候,就意味着,超级管理员不在登录态了,请求是没法完成的
我们把数据包点一次重放,跟踪重定向
重定向到登录页面,因为后台检测到,当前的请求,登录态已经退出了,这个请求是没有登录的,直接提示,请重新登录
我们可以来看一下,后台的账户,有没有添加成功,我们的思路,这种情况下,是没法添加成功的
这里只有一个yyy,没有第二个yyy,我们在退出,重新登录,用普通管理员的账号登录一下,pikachu,000000
登录之后,我们可以看到普通管理员只有查看权限,没法进行添加用户,我们把页面刷新一下,获取对应页面的登录态
我们把当前页面的登录态复制一下,
这个是普通用户的登录cookie:
Cookie: PHPSESSID=s37inc52hoql457esl8qqdvuu2
把超级管理员的cookie换成普通管理员的cookie,因为现在超级管理员的登录态已经退出了
这个意思就是说,我们以普通用户的身份,去操作管理员的操作,我们点一次重放
它直接跳到登录态里面去了,我们看一下,对应页面的记录,然后,我们看一下相关的记录,点一下刷新
又多出来一个yyy,这个实验,就证明了这个地方是存在垂直越权漏洞的,也就是说,我们可以通过普通管理员的登录态,去重放一个超级管理员的操作,这时候,后台没有对权限进行严格的校验,所以,它会导致,它会把操作进行执行
垂直越权在实际上的利用当中是比较难的,做为普通管理员,我们要抓到超级管理员,有那些操作,在去重放,这是比较难的
在我们的安全测试环节当中,这也是,必须要测试的环节,特别是在一些后台管理系统里面,它有管理员,有普通用户等等,它有不同的权限,这种情况下,往往会出现垂直越权的漏洞
首先登录的时候,会去判断我们的用户级别,如果级别是1,你是管理员,他就会让你进管理员的页面,如果不是管理员,就会让你进普通用户的界面,这个是没问题的
//op_admin_edit.php页面的权限校验
if(!check_op2_login($link)){//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
skip('你没有登录,无权管理中心,请登录', 'overadmin.php');
}
if(isset($_POST['submit'])){
if($_POST['username']!=null && $_POST['password']!=null){//用户名密码必填
$getdata=escape($link, $_POST);//转义
$query="insert into uname(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){//判断是否插入
skip('添加成功', 'op_admin.php');
}else {
skip('修改失败,请重试', 'op_admin.php');
} } }
判断登录态,首先只有你登录后,才能访问
在session里面,去拿到对应的用户名和密码,也就是说,他只是判断当前用户,有没有登录,但是,他并没有判断当前登录页面的权限是什么,因为你这个操作,在逻辑上,只有管理员才能操作的,其它人是不能操作的,在这个后面,你还要去判断这个级别的用户是不是等于1,如果不等于1,就不让他操作,如果等于1,就让他操作,所以说,这个地方的逻辑疏忽了,就产生了这个问题
对权限进行严格的划分,按照“最小权限原则”进行权限的划分
在代码上对权限进行严格的控制,避免出现权限的逻辑判断问题