题目描述
来源:XCTF 4th-QCTF-2018
Solution
打开网页,发现要我们买彩票,我们买一个试试:
你可以来到 Account 观察自己的余额,每买一次彩票会少 2 美元。
点击 Claim Your Prize,题目告诉我们要赚够 9990000 美元才能买到 Flag:
我们用 dirsearch 扫一下目录,可以发现有 git 源码文件:
我们使用 GitHack 扫描 URL,把泄露的文件都下载下来:
下载完后 GitHack 会以 IP 为名字在当前目录创建一个文件夹,里面内容是这样的:
打开其中的 api.php
文件审计代码,注意到这里有个 buy()
函数,这个是我们在网页买彩票会调用的函数。其中我们看到 numbers
这个变量是我们能操作的,函数会以数组的形式提取每位数字。同时这个变量在和随机生成的 win_numbers
变量比较时使用的是 ==
,也就是说可以用弱类型来绕过。
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]);
}
用 Brupsuite 抓包,购买彩票时会用 POST 请求传参:
我们把它发送到 Repeater,修改numbers
变量为:[true,true,true,true,true,true,true]
利用重放器把钱刷够后就可以去买 Flag 了: