PHP-CTF-Docker /day4

buy.php,加载了js中的buy.js

<script type="text/javascript" src="js/buy.js"></script>

buy.js中发起对api.php的post请求,并且带上了我们输入的7位号码

function buy(){
    $('#wait').show();
    $('#result').hide();
    var input = $('#numbers')[0];
    if(input.validity.valid){
        var numbers = input.value;
        $.ajax({
          method: "POST",
          url: "api.php",
          dataType: "json",
          contentType: "application/json", 
          data: JSON.stringify({ action: "buy", numbers: numbers })
        }).done(function(resp){
            if(resp.status == 'ok'){
                show_result(resp);
            } else {
                alert(resp.msg);
            }
        })
    } else {
        alert('invalid');
    }
    $('#wait').hide();
}

api.php:

function random_win_nums(){
    $result = '';
    for($i=0; $i<7; $i++){
        $result .= random_num();
    }
    return $result;
}


function buy($req){
    require_registered();
    require_min_money(2);

    $money = $_SESSION['money'];
    $numbers = $req['numbers'];
    $win_numbers = random_win_nums();
    $same_count = 0;
    for($i=0; $i<7; $i++){
        if($numbers[$i] == $win_numbers[$i]){
            $same_count++;
        }
    }
    switch ($same_count) {
        case 2:
            $prize = 5;
            break;
        case 3:
            $prize = 20;
            break;
        case 4:
            $prize = 300;
            break;
        case 5:
            $prize = 1800;
            break;
        case 6:
            $prize = 200000;
            break;
        case 7:
            $prize = 5000000;
            break;
        default:
            $prize = 0;
            break;
    }
    $money += $prize - 2;
    $_SESSION['money'] = $money;
    response(['status'=>'ok','numbers'=>$numbers, 'win_numbers'=>$win_numbers, 'money'=>$money, 'prize'=>$prize]);
}

 

1、通过random_win_nums()函数生成了中奖号码

2、中奖的判断代码:

    for($i=0; $i<7; $i++){
        if($numbers[$i] == $win_numbers[$i]){
            $same_count++;
        }
    }

3、==和===的区别

这里使用的是 "==",在执行==之前需要让两边的数据类型必须一致,如果数据类型不一致,就会强制转换运算符右边的数据。

而在===中,如果两边的数据类型不一致则直接返回false。

4、==比较利用

这里我们就可以传入一个全为true的数组,那么只要生成的中奖号码中没有0的话就可以完全相同,然后得到prize去获取flag

 

示例:

<?php
$number='3569456';
$a=[(bool)$number[0],
    (bool)$number[1],
    (bool)$number[2],
    (bool)$number[3],
    (bool)$number[4],
    (bool)$number[5],
    (bool)$number[6]];
var_dump($a);
?>

结果:

array(7) {
  [0]=>
  bool(true)
  [1]=>
  bool(true)
  [2]=>
  bool(true)
  [3]=>
  bool(true)
  [4]=>
  bool(true)
  [5]=>
  bool(true)
  [6]=>
  bool(true)
}

 

 

 

 

 

 


最后贴上一个松散比较的表格:

 https://www.php.net/manual/zh/types.comparisons.php

 

 

posted @ 2021-06-19 16:27  1jzz  阅读(73)  评论(0编辑  收藏  举报