1. 直接进入实验环境,按照提示玩一遍

xctf攻防世界 Web高手进阶区 lottery_git


玩完后,直接账户为0,好家伙,赌博真不行,就这运气迟早输到裸奔。。。

再点点兑奖页面,发现​​购买flag需要$9990000​​,于是大胆猜测,这一题提示我们要想办法赢钱,去获得足够的money去购买到最终的flag!

2. 解题开始

  1. 猜测响应页面
    于是乎对于提示窗口信息,追溯到控制台,查看响应页面,发现是​​api.php​​页面触发回显,因此,我猜测后端响应页面api.php的代码审计对解题至关重要。
  2. xctf攻防世界 Web高手进阶区 lottery_前端_02

  3. 思考如何拿到源码
    对于此类的非直接代码审计的问题,无非是拿到后台代码,控制台又没有直接显示,因此联想到之前的遇到的解法,利用​​.git​​泄露漏洞尝试拿到后台代码。

在此,我们尝试使用​​GitHack​​​工具。代码仓库链接:​​https://github.com/BugScanTeam/GitHack​​,注意,需要使用python2的环境运行!

git

如图:

xctf攻防世界 Web高手进阶区 lottery_git_03

运行脚本,克隆仓库

python2 GitHack.py http://111.200.241.244:64897/.git/

如图:

xctf攻防世界 Web高手进阶区 lottery_git_04

  1. 拿到了代码,根据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走起

抓到购买彩票的包,如图:

xctf攻防世界 Web高手进阶区 lottery_前端_05


将其中的numbers修改为bool类型的数值,如图:

xctf攻防世界 Web高手进阶区 lottery_代码审计_06


刷新页面可以看到钱增加了,于是开心的多刷了几次,假装感受一下中间的快乐

4. 开心的购买flag

xctf攻防世界 Web高手进阶区 lottery_git_07

5. 总结

  • 考察.git漏洞
  • 代码审计和追踪
  • burpsuite抓包和测试

总之这道题还是很温柔的,如有问题,请指正