越权漏洞
Posted 坠水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了越权漏洞相关的知识,希望对你有一定的参考价值。
什么是越权漏洞?
越权漏洞指的是应用在检查授权时存在纰漏,可以让攻击者获得低权限用户账户后,利用一些方式绕过权限检查,可以访问或者操作其他用户或者更高权限,而越权漏洞是属于业务性漏洞,困难在于这类漏洞并不是代码本身存在问题,我们利用一些自动化检测工具很难检测出漏洞,所以我们需要额外关注这类漏洞。
越权漏洞的分类:
- 水平越权:用户在同级别用户进行越权访问,删除,修改数据
- 垂直越权:用户可以向更高级别的用户越权进行访问,修改,删除数据
- 未授权访问:攻击者在没有获得访问权的情况下可以直接进行访问,修改删除数据
简单的案例演示
-
水平越权(pikachu)
先用kobe这个用户登录,抓包
将uesrname=kobe该为username=lucy
查看源代码
登录页面 ,如果输入的用户名和密码不为空,且能在数据库中存在,就将用户名和密码存放在session中,并跳转到信息查看页面
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;
$_SESSION['op']['password']=sha1(md5($password));
header("location:op1_mem.php");
else
$html.="<p>登录失败,请重新登录</p>";
信息查看页面,检查session中的username值是否存在,若存在就从数据库中检索信息并打印出来。但是这里get传进去的值可以被攻击者篡改,从而造成越权漏洞,正确的方法应该是使用$_SESSION['op']['username']来进行校验,因为session存放在服务端,攻击者不能进行伪造
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'];
<form class="msg1" method="get">
<input type="hidden" name="username" value="<?php echo $_SESSION['op']['username']; ?>" />
<input type="submit" name="submit" value="点击查看个人信息" />
</form>
垂直越权(pikachu)
先登录admin管理员账号,然后添加数据,抓取管理员账号的cookie
退出管理员账号,登录普通用户的账号,抓取cookie,将普通用户的cookie替换掉管理员账号的cookie,重新发包,数据添加成功。
代码分析:
这里check_op2_login($link) 只检测了用户的登录状态,即只检测了session是否存在,session存在就通过验证,没有进行级别验证。可以将用户权限放入session中(登录页面中,管理员用户等级为1,普通用户等级为2),然后在数据添加文件代码中添加对用户权限等级的验证。
function check_op2_login($link)
if(isset($_SESSION['op2']['username']) && isset($_SESSION['op2']['password']))
$query="select * from users where username='$_SESSION['op2']['username']' and sha1(password)='$_SESSION['op2']['password']'";
$result=execute($link,$query);
if(mysqli_num_rows($result)==1)
return true;
else
return false;
else
return false;
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>";
浅谈越权漏洞
越权漏洞是一种很常见的逻辑安全漏洞。是由于服务器端对客户提出的数据操作请求过分信任,忽略了对该用户操作权限的判定,导致修改相关参数就可以拥有了其他账户的增、删、查、改功能,从而导致越权漏洞。
1、 分类
根据对数据库的操作进行分类,可以分为以下几类:越权查询、越权删除、越权修改、越权添加等。
根据维度进行分类,可分为:平行越权、垂直越权、交叉越权。
平行越权:权限类型不变,权限ID改变;如:同是普通用户,其中一个用户可查看其它用户信息。常见的就是通过修改某一个ID参数来查看其他用户的信息,比如你查看自己的信息时,发现URL连接中,或者http请求头中有一个userID的参数,然后你修改这个参数就可以查看那个人信息了!
垂直越权:权限ID不变,权限类型改变;如普通用户可使用管理员权限进行操作。如你登录时,发现cookie中有一个roleID的角色参数,那么可以通过修改该ID为1或者0,根据具体情况来定,就可以使用管理员权限了!
交叉越权:权限类型改变,权限ID也改变。
2、 越权漏洞危害
越权漏洞的危害与影响主要是与对应业务的重要性相关,比如说某一页面服务器端响应(不局限于页面返回的信息,有时信息在响应包中,页面不一定能看见)中返回登录名、登录密码、手机号、身份证等敏感信息,如果存在平行越权,通过对用户ID的遍历,就可以查看所有用户的敏感信息,这也是一种变相的脱裤,而且很难被防火墙发现,因为这和正常的访问请求没有什么区别,也不会包含特殊字符,具有十足的隐秘性。
3、如何检测越权漏洞
最简单的一种检测方式是,首先是通过定位鉴权参数,然后替换为其他账户鉴权参数的方法来发现越权漏洞。
4、 越权漏洞修复方案
1、基础安全架构,完善用户权限体系。要知道哪些数据对于哪些用户,哪些数据不应该由哪些用户操作;
2、鉴权,服务端对请求的数据和当前用户身份做校验;
3、不要直接使用对象的实名或关键字。
4、对于可控参数进行严格的检查与过滤!
本文出自 “eth10” 博客,请务必保留此出处http://eth10.blog.51cto.com/13143704/1959560
以上是关于越权漏洞的主要内容,如果未能解决你的问题,请参考以下文章