Mark loves cat

【Mark loves cat】扫描目录(但是我用御剑扫不出来) ,然后用.git下载文件

$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;

Mark loves cat
文章图片

分析代码,主要是输入的值符合某个条件时,输出对应的值(之前我还以为要用反序列化)
从这个地方开始有输出,但是要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); }

Mark loves cat
文章图片

可见是正确的
二和三只能满足一个,先看看第三个
法一:
?flag=flag&is=flag

Mark loves cat
文章图片

但是is=flag放在POST里就没用了,不知道为什么
Mark loves cat
文章图片

法二:
看下第二个的
?yds=flag

Mark loves cat
文章图片


    推荐阅读