[BJDCTF 2020]Mark loves cat
git源码泄露
dirsearch发现/.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'){
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;
这里有变量覆盖的漏洞:
- 先看第一个
exit($handsome)
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
如果 get型flag参数绝对等于变量名并且变量名等不等于flag则执行 exit($handsome)
,这里可以用?flag=aaa&aaa=123
输出$handsome
,但是这个写法会在前面进行变量覆盖的时候让$flag = $aaa
进而报错(因为$aaa
不存在),因此这里行不通。
- 再看第二个
exit($yds)
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
如果GET和POST都没有传flag参数,则执行exit($yds)
这里可以传?yds=flag
,经过变量覆盖之后就$yds = $flag
,从而输出$flag
的值。
- 最后看第三个
exit($is)
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
如果GET或POST有一个或都传了flag参数而且参数值为flag,则执行exit($is)
这里我们可以让GET传$_GET[flag]=flag
,则进入了条件语句里面,再传?is=flag
,进行变量覆盖使$is = $flag
,即可。