xctf攻防世界 Web高手进阶区 lottery
原创
©著作权归作者所有:来自51CTO博客作者l8947943s的原创作品,请联系作者获取转载授权,否则将追究法律责任
1. 直接进入实验环境,按照提示玩一遍
玩完后,直接账户为0,好家伙,赌博真不行,就这运气迟早输到裸奔。。。
再点点兑奖页面,发现购买flag需要$9990000
,于是大胆猜测,这一题提示我们要想办法赢钱,去获得足够的money去购买到最终的flag!
2. 解题开始
- 猜测响应页面
于是乎对于提示窗口信息,追溯到控制台,查看响应页面,发现是api.php
页面触发回显,因此,我猜测后端响应页面api.php的代码审计对解题至关重要。 - 思考如何拿到源码
对于此类的非直接代码审计的问题,无非是拿到后台代码,控制台又没有直接显示,因此联想到之前的遇到的解法,利用.git
泄露漏洞尝试拿到后台代码。
在此,我们尝试使用GitHack
工具。代码仓库链接:https://github.com/BugScanTeam/GitHack,注意,需要使用python2的环境运行!
如图:
运行脚本,克隆仓库
python2 GitHack.py http://111.200.241.244:64897/.git/
如图:
- 拿到了代码,根据1的思路,审计
api.php
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]);
}
我们可与看到if($numbers[$i] == $win_numbers[$i])
,这个判断条件是非严谨的判定,当true与任何数字对比,结果都返回true,因此,可以想到伪造payload,实现后台判断逻辑的欺骗。
3. burpsuite走起
抓到购买彩票的包,如图:
将其中的numbers修改为bool类型的数值,如图:
刷新页面可以看到钱增加了,于是开心的多刷了几次,假装感受一下中间的快乐
4. 开心的购买flag
5. 总结
- 考察.git漏洞
- 代码审计和追踪
- burpsuite抓包和测试
总之这道题还是很温柔的,如有问题,请指正