逻辑漏洞挖掘


逻辑漏洞挖掘

逻辑漏洞就是值攻击者利用业务设计缺陷,湖取名干信息或破坏业务完整性。一般出现在密码修改,越权访问,密码找回,交易支付金额等功能处。其中越权访问又有水平越权和垂直越权两种

  • 水平越权:

    • 相同级别(权限)的用户或者同一角色中不同用户之间,可以越权访问,修改或删除其他用户信息的非法操作。如果出现此漏洞,可能会造成大批量数据的泄漏,严重的甚至会导致用户的信息被恶意篡改
  • 垂直越权:

    • 就是不同级别的用户之间或不同角色之间用户的越权,比如普通用户可以执行管理员才能执行的功能呢

逻辑缺陷表现为设计者或开发者在思考过程中做出的特殊假设存在明显或隐含的错误

精明的攻击者会特别注意目标应用程序采用的逻辑方式,并设法了解设计者与开发者可能做出的假设,然后考虑如何攻破这些假设,黑客在挖掘逻辑漏洞时有两个重点: 业务流程和HTTP/HTTPS请求的篡改。

  • 常见的逻辑漏洞:
    • 支付订单: 在支付订单时,可以篡改价格为任意金额:或者可以篡改运费或其他运费为负数,导致总金额降低
    • 越权访问: 通过越权漏洞访问他人信息或者操纵他人账号
    • 重置密码: 在重置密码时存在副哦中逻辑漏洞,比如利用session覆盖重置密码,短信验证码直接在返回的数据包中
    • 竞争条件: 竞争条件常见于多种攻击场景中,比如文件上传漏洞,还有一个常见的场景就是购物时,例如用户A的余额时10元,商品B的价格为6元,商品C的价格为5元,如果用户A分别购买商品B和商品C,那余额肯定不够但是如果用户A利用条件竞争,使用多线程同时发送够买商品B和商品C的需求,可能会出现以下几种结果。
      • 有一件商品购买失败
      • 商品都购买成功,但是只扣了6元
      • 商品都购买成功,但是余额变成了-1元

越权访问代码分析:

<html>
<head>
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <title>个人信息</title>
</head>
<body>
<?php
$con = mysqli_connect("localhost","root","123456","test");
if(mysqli_connect_errno()){
    echo "连接失败:". mysqli_connect_error();
}
if(isset($_GET['username'])){
    $result = mysqli_query($con,"select * from users where `username`='".addslashes($_GET['username'])."'");
    $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
    exit(
        '用 户:<input type="text" name="username" value="'.$row['username'].'"><br/>'.
        '密 码:<input type="password" value="'.$row['password'].'"><br/>.
        '邮 箱:<input type="text" value="'.$row['email'].'"><br />'.
        '地 址:<input type="text" value="'.$row['address'].'"><br />'
);
}else{
    $username=$_POST['username'];
    $password=$_POST['username'];
    $result=mysqli_query($con,"select * from users where `username`='".addslashes($username)."'and `password`='".md5($password)."'");
    $row = mysqli_fetch_array($result);
    if($row){
        exit("登陆成功"."<a href='login.php?username=".$username."'>个人信息</a>");
    }else{
        exit("登陆失败");
    }
}
?>
</body>
</html>
  • 在else语句中获取POST的参数username和参数password,然后到数据库查询,如果正确,则登陆成功,然后跳转到login.php?username=$username处(if语句)
  • if语句中是登陆成功后的代码,获取GET参数username,然后到数据库中查询参数username的所有信息,并返回页面

但是此处没有考虑的是,如果直接访问login.php?usename=admin,那么将直接执行if语句的代码,而没有执行else的代码,所以此处不需要登陆就可以查看admin的信息,通过这种方式,就可以越权访问其他用户的信息

越权访问修复建议

  • 越权访问漏洞的产生的主要原因是没有对用户的身份做判断和控制,防护这种漏洞时,可以通过session来控制。例如在用户登陆之后,将username或uid写入到session中,当用户查看个人信息时,从session中取出username,而不是从GET和POST取username,那么此时渠道的username就是没有被篡改的

文章作者: 尘落
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 尘落 !
评论
  目录