当前位置:   article > 正文

关于前端JS安全代码层分析_res.infocode

res.infocode

前端验证漏洞

0.概述

前端验证漏洞是指主要采用JS作为前端数据验证媒介时进而产生的一种漏洞。

1.AJAX身份验证

Ajax定义: AJAX不是JavaScript的规范,它只是一个哥们“发明”的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求,实现数据的交互(原用php交互)。

异步:指的是一次性发送多个数据再进行校验。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AJax传参与JQuery引用</title>
</head>
<script src="jquery-1.12.4.min.js"></script> <!--调用JQuery框架标志(黑盒测试中常见)-->
<body>
帐号:<input type="text" class="user">
密码:<input type="password" class="pass">
<button>用户登录</button>
<script>
    $('button').click(function () {
        $.ajax({
            type:'post',
            url:'ajax.php', //传递的目标
            dataType:'json',
            data:{
                myUname:$('.user').val(),
                myUpass:$('.pass').val()
            },
            success:function (res){
                if(res.infoCode == 1){
                    alert('登录成功!');
                }else {
                    alert('登录失败!');
                }
            }
        })
    });
</script>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

后端验证代码:

<?php
//1.接受传参
$username = $_POST['myUname'];
$password = $_POST['myUpass'];

$success = array(
    'msg'=>'ok',
    'infoCode'=>0
); //设置字典的目录与默认对应值

//2.后端检验
if ($username=='Haige' && $password=='666'){
    $success['infoCode'] = 1;
}else{
    $success['infoCode'] = 0;
}

echo json_encode($success); //输出编码(方便在控制台中的Response中观察)
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

后期的后端验证无非就是在后端验证代码中加入数据库连接,再将输入的账号密码与数据库中管理员的账号密码进行对应验证。(infoCode字段即为登录成功与否标志位)

在代码编写中容易犯传参大小写忽略问题!

验证原理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmLB4ief-1675607793137)(H:\笔记方面\信安\迪哥\2022\PHP代码基础\images\Ajax\2.Ajax原理.png)]

可能存在的漏洞–>未授权访问
success:function (res){
                if(res.infoCode == 1){
                    alert('登录成功!');
                }else {
                    alert('登录失败!');
                }
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

由上面的代码分析可得前端仅仅只是验证了infoCode这个选项是否为1就赋予后台登录权限,因此可进行抓包修改工具将后台发送给前端的数据包进行修改,进而达到目的

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zUC1T6mn-1675607793139)(H:\笔记方面\信安\迪哥\2022\PHP代码基础\images\Ajax\2.修改绕过.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0j4LnUx-1675607793140)(H:\笔记方面\信安\迪哥\2022\PHP代码基础\images\Ajax\3.成功.png)]

总结: 功能越复杂并不是越安全,反之精简的功能的代码产生漏洞的概率可能会小些。

2.Ajax逻辑支付

1.前端设置好价格后端进行购买计算,再前端验证

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>购买设计1</title>
</head>
<script src="../jquery-1.12.4.min.js"></script>
<body>
    <img src="../iphone.jpg" width="270" height="270" alt=""/><br>
    价格:8888<br>
    数量:<input type="text" class="num">
    <button>购买</button>

    <script>
        $('button').click(function () {
            $.ajax({
                type:'POST',
                url:'shop.php',
                dataType:'json',
                data:{
                    price:'8888',
                    number:$('.num').val() //获取类名中的数据  (.'类名').val()
                },

                success:function (res) {
                    if (res.code == 1){
                        alert('购买成功!');
                    }else {
                        alert('购买失败!');
                    }
                }
            });
        });
    </script>
</body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

由代码可知,此种方式容易产生的漏洞与前面Ajax越权登录相似,其验证原理也相似。依葫芦画瓢即可.

2.商品价格以前端设置价格为准,数据接收价格后运算

对应模型:1.后端数据发送到前端 2.前端接受数据进行接受并相关运算(通常采用数据库中的数据作为设置)

前端:

<?php
    //从数据库中提取价格参数
    $con = mysqli_connect("127.0.0.1","root","root","study");
    if ($con -> connect_error){
    echo "连接失败"."<br>";
    }else{
        echo "连接成功"."<br>";
    }
	//从数据库中提取数据作为设置的价格
    $sql='select * from shop where id=1';
    $result = mysqli_query($con,$sql);
    while ($row = mysqli_fetch_row($result)){
        $imgsrc = $row[2];
        $price = $row[1];
    }
    echo "<img src='../iphone.jpg' width='270' height='270' alt=''/><br>";
    echo "价格:$price<br>";
    echo "数量:<input type='text' class='num'>";
    echo "<button>购买</button>";
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>购买设计2</title>
</head>
<script src="../jquery-1.12.4.min.js"></script>
<body>
    <script>
        $('button').click(function () {
            $.ajax({
                type:'POST',
                url:'shop.php',
                dataType:'json',
                data:{
                    price:<?php echo $price?>, //这里传递的价格虽然是从数据库中获取但也是从前端传递
                    number:$('.num').val() //获取类名中的数据  (.'类名').val()
                },

                success:function (res) {
                    if (res.code == 1){
                        alert('购买成功!');
                    }else {
                        alert('购买失败!');
                    }
                }
            });
        });
    </script>
</body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

后端shop.php

<?php
header("Content-Type:text/html;charset=utf-8");
$success = array(
    'msg'=>'ok',
    'code'=>0
);

$price = $_POST['price'];
$num = $_POST['number'];

$m=$price*$num;

if($m<10000){
    $success['code']=1;
}else{
    $success['code']=0;
}

echo json_encode($success);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

分析:

参数传递的参数虽然是从数据库中获取,但参数任然是通过Ajax传递的 Json格式,因此可通过抓包拦截进而造成一系列安全问题。此种情况虽然价格是从数据库提取,但任是通过前端传递验证

 data:{
                    price:<?php echo $price?>, //这里传递的价格虽然是从数据库中获取但也是从前端传递
                    number:$('.num').val() //获取类名中的数据  (.'类名').val()
                },
  • 1
  • 2
  • 3
  • 4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lKZAvcfU-1675607793141)(H:\笔记方面\信安\迪哥\2022\PHP代码基础\images\Ajax\4.可修改的面.png)]

在这里插入图片描述

修改价格(零元购)可造成或是订购number(为0.01或是负数)可造成一系列逻辑支付的问题

3.问题规避

  • 仅使用后端验证(即价格由后端从数据库中提取)
  • 后端接受参数,并限制前端的部分传递参数,并对传递的参数进行加密
if ($num > 0 && filter_var($num,$num)) {
    if (直接数据库中接受的价格 * $num < 10000) {
        $success['code'] = 1;
    } else {
        $success['code'] = 0;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这样的化就会相对安全一点,总结就是尽量减少前后端数据交互,亦或是添加好交互时的过滤语句,避免数据在前后端交互过程中被修改*

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/945461
推荐阅读
相关标签
  

闽ICP备14008679号