逻辑漏洞(越权访问和支付漏洞)

本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记

前文链接

  1. WAMP/DVWA/sqli-labs 搭建
  2. burpsuite工具抓包及Intruder暴力破解的使用
  3. 目录扫描,请求重发,漏洞扫描等工具的使用
  4. 网站信息收集及nmap的下载使用
  5. SQL注入(1)——了解成因和手工注入方法
  6. SQL注入(2)——各种注入
  7. SQL注入(3)——SQLMAP
  8. SQL注入(4)——实战SQL注入拿webshell
  9. Vulnhub靶机渗透之Me and My Girlfriend
  10. XSS漏洞
  11. 文件上传漏洞
  12. 文件上传绕过
  13. 文件包含漏洞
  14. Vulnhub靶机渗透之zico2
  15. 命令执行漏洞

介绍

逻辑漏洞指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性。一般出现在密码修改,越权访问,密码找回,交易支付金额等功能处。本篇着重讲解越权访问漏洞和交易漏洞。

逻辑漏洞表现为开发者或设计者在开发过程中对逻辑的不正确判断,也就是写代码不够认真,从而产生的漏洞,是人为造成的。

越权访问

分为水平越权和垂直越权。

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

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

在我实际渗透中,某次遇到一个网站存在水平越权漏洞,当时网站某些部分需要邀请新用户或充值才能访问,但我作为0氪用户,是不可能搞这些的。但我抓包发现存在水平越权漏洞,可以查看,修改其它用户的密码。因此我就一直用别人的账号。那个网站至今还没有修复这个漏洞。
逻辑漏洞(越权访问和支付漏洞)_第1张图片
垂直越权最常见的就是普通用户执行了管理员的操作,例如在DedeCMS中,普通用户可以非法修改管理员(admin)的密码。以及前文的代码执行漏洞,使普通用户有操控服务器的权限。都属于垂直越权。

按照习惯,先来一个实例。

某网站可以查看用户密码,但是存在越权访问漏洞。

由于只是实例,这里就不连接数据库了。

index.php


    $users=array(
        "1"=>"123456",
        "2"=>"HelloWorld",
        "3"=>"manlu"
    );
    if (isset($_COOKIE['id'])){
        $id=$_COOKIE['id'];
    }else{
        setcookie("id",'1');
        header("Refresh:0");
    }
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>查看用户信息</title>
</head>
<body>
<label for="id">用户id:</label>
<input type="text" id="id" value="$id?>"><br>
<label for="pwd">用户密码:</label>
<input type="password" id="pwd" value="$users[$id]?>"><button>查看</button>
<script>
    document.getElementsByTagName('button')[0].onclick=function () {
        document.getElementById("pwd").type="text";
    }
</script>
</body>
</html>

访问该界面,可以看到id为1的用户的密码。
逻辑漏洞(越权访问和支付漏洞)_第2张图片
按下F12查看cookie,发现了参数id
逻辑漏洞(越权访问和支付漏洞)_第3张图片
假如将参数id改为其他的数字,就可以看到其它用户的密码。

当id为2时
逻辑漏洞(越权访问和支付漏洞)_第4张图片
这就是一次水平越权访问漏洞。

假如某个存在水平越权漏洞的网站允许用户更改密码,攻击者可以修改其它用户的密码,同时配合脚本,可以获取所有用户的信息。

垂直越权
还是刚才的实例,假如用户表中还存储了admin的账号密码,就可以非法得到admin的账号密码。

$users=array(
        "0"=>"admin",
        "1"=>"123456",
        "2"=>"HelloWorld",
        "3"=>"manlu"
    );

逻辑漏洞(越权访问和支付漏洞)_第5张图片

支付漏洞

常见的支付漏洞有:

  • 支付订单: 在支付订单时,可以篡改价格为任意金额;或者可以篡改运费或其他费用为负数,导致总金额降低。

  • 竞争条件: 在前文的文件上传漏洞中有提到,利用于多种场景。假如用户A余额为10元,商品B价格为6元,C价格为5元,假如A想购买B和C,余额是不够的。但是如果A利用竞争条件,使用多线程同时发送购买商品的请求,可能会出现以下几种结果:
    ①有一件商品购买成功
    ②商品都购买成功,但只扣了6元
    ③商品都购买成功,余额变为-1

直接上实例

index.php


    $balance=0;
    if (isset($_COOKIE['balance'])){
        $balance=(double)$_COOKIE['balance'];
    }else{
        setcookie("balance","10");
        header("Refresh:0");
    }
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>购买</title>
</head>
<body>
<div>
    <h2>余额:<?=$balance?></h2>
</div>
<form id="form">
    <label for="price">商品价格:</label><br>
    <input type="text" disabled="disabled" value="6"><br>
    <label for="number">购买数量:</label><br>
    <input type="number" id="number" value="1" name="number"><br>
    <input type="button" value="确认购买" id="btn">
</form>
<script>
    document.getElementById("btn").onclick=function () {
        var form=document.getElementById("form");
        var formdata=new FormData(form);
        formdata.append("price",'6');
        var xhr=new XMLHttpRequest();
        xhr.open("POST","buy.php",true);
        xhr.send(formdata);
        xhr.onreadystatechange=function()
        {
            if (xhr.readyState==4 && xhr.status==200)
            {
                var text=xhr.responseText;
                alert(text);
                location.reload();
            }
        }
    };
</script>
</body>
</html>

buy.php


    $price=(double)$_POST['price'];
    $number=(int)$_POST['number'];
    $balance=(double)$_COOKIE['balance'];
    $money=$number*$price;
    if ($balance>$money){
        setcookie("balance",(string)($balance-$money));
        echo "购买成功";
    }else{
        echo "余额不足";
    }
    ?>

在这里存在两种漏洞利用的方式,修改数量和修改金额(修改余额是不行的,实际渗透中余额都存在数据库中,这里为了方便存在cookie中)。

访问网站,发现给了我们10块钱
逻辑漏洞(越权访问和支付漏洞)_第6张图片
发现这里可以修改购买数量。

打开bp,点击确认购买,抓包查看。
逻辑漏洞(越权访问和支付漏洞)_第7张图片
在这里将购买数量number改为 -1
在这里插入图片描述
发送,购买成功,发现余额变成了16
逻辑漏洞(越权访问和支付漏洞)_第8张图片
逻辑漏洞(越权访问和支付漏洞)_第9张图片

此外还可以修改商品金额,还是同样的抓包,把金额price改为 -10
逻辑漏洞(越权访问和支付漏洞)_第10张图片
发送,弹出购买成功
逻辑漏洞(越权访问和支付漏洞)_第11张图片
发现余额变为20
逻辑漏洞(越权访问和支付漏洞)_第12张图片

竞争条件在此不掩饰,可自行测试。

防范

越权访问
严格检查用户的Cookie,做好身份确认

购买漏洞
严格处理用户的输入,不要相信前端规范,在后端进行防范。

你可能感兴趣的:(安全,安全,php)