【攻防世界】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}


浙公网安备 33010602011771号