BJDCTF2020Mark loves cat
$y){
$$x = $y;
}
foreach($_GET as $x => $y){ //通过post方式传递$flag=flag,最终结果为$$flag=flag 这便是POST方式处理代码
$$x = $$y;
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //通过get传递yds=flag 得到$yds=$flag
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //get和post中不存在flag参数便退出程序输出$yds变量,得到flag
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;" //这是index.php 的源码
**根据$$和foreach可以判断可能存在变量覆盖漏洞**,也就是可以将$yds,$is,$handsome的值进行覆盖成$flag变量,然后输出对应变量的值,获取flag。
例如代码第17-19行,需要get传参?flag=flag,才能进入if语句中输出$handsome,但是foreach中并不能将$flag赋值给$handsome然后输出,所以此处无法利用。
扫描**目录找到 .git 泄露**
**然后githack 把源码下下来**
发现就两个重要文件,flag.php,读取flag文件内容并赋值给$flag:
index.php,开头有个包含,在最后有个输出flag
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
} 发现get和post中不存在flag参数便退出程序输出$yds变量
传递如下参数 :
get: yds=flag
post: $flag=flag
那么最终payload **?yds=flag**
** post: $flag=flag**