题目描述
来源: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 了:

