扫描目录(但是我用御剑扫不出来) ,然后用.git下载文件
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){ //很明显的有变量覆写漏洞
$$x = $y ;
}
foreach($_GET as $x => $y){ //如果传入$x=flag&$y=flag 则$flag=$flag就可以输出结果
$$x = $$y;
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //传入GET的键名要为flag,然而键名又不能有flag,(直接弃了这个)
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //不存在键名为flag的GET与POST,输出变量$yds
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is
exit($is);
}
echo "the flag is: ".$flag;
分析代码,主要是输入的值符合某个条件时,输出对应的值(之前我还以为要用反序列化)
从这个地方开始有输出,但是要x等于键名,又不等于键名,不存在
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //传入GET的键名要为flag,然而键名又不能有flag,(直接弃了这个)
exit($handsome);
}
}
第二个,不存在键名为flag的GET与POST,输出变量$yds,先留着,好像可以操作
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //不存在键名为flag的GET与POST,输出变量$yds
exit($yds);
}
第三个,传入的POST的键名为flag或者GET的键名为flag,值为flag,则输出变量$is
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is
exit($is);
}
可见是正确的
二和三只能满足一个,先看看第三个
法一:
?flag=flag&is=flag
但是is=flag放在POST里就没用了,不知道为什么
法二:
看下第二个的
?yds=flag