【攻防世界】Lottery

进入题目,是个买彩票换flag的网站,同时附件提供了源码

 

 

在注册了一个名字,了解本题的逻辑:猜7位数的彩票,猜中的位数越多给的奖励越多,最后要用奖励换flag

 开赌!尝试burp改包

 发现每次都会重新随机,根本猜不中

 去看一下源码,在api.php中找到了相关逻辑

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

    $money = $_SESSION['money'];     #接受用户原有money
    $numbers = $req['numbers'];     #接受输入的数字
    $win_numbers = random_win_nums();   #产生7位随机数
    $same_count = 0;            #中奖数字的个数
    for($i=0; $i<7; $i++){
        if($numbers[$i] == $win_numbers[$i]){  #这里是一个弱比较==,如果数组中的值都是true的话,比较永远都是正确的
            $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]);
}

以下为函数的关键部分,发现是“==”的弱相等而不是“===”强相等

===比较两个变量的值和类型;==比较两个变量的值,不比较数据类型。

在php中,如果bool和"任何其他类型"比较,"任何其他类型"会转换为bool。

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

也就是说,只要我们把输入的七位数都改成true,那么随机的那几位数只要不是0,结果就会是true,也相当于猜对了。

 注意,如果中奖号码随机生成的数字中有0,那么true=0是会比较失败的,不过多尝试几次就能攒够钱买flag了。

开始实践,用burpsuite截取发送的number并将其修改成{"action":"buy","numbers":[true,true,true,true,true,true,true]}就可以赚取住够的钱购买flag

 注意,图中的第十四行必须空出来,这个相当于请求头的结束标记,类似于链表的null,我们修改的内容是请求体的,如果中间没有空一行,浏览器会解析不出来

 

 然后去account里面看,也是靠猜彩票成了千万富翁,轻松拿下flag:

flag: cyberpeace{93bdf60c28a5562cf439bdabcb327fe2}

 

 

 

posted @ 2025-04-29 15:06  Antoniiiia  阅读(61)  评论(0)    收藏  举报