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_第1张图片

分析代码,主要是输入的值符合某个条件时,输出对应的值(之前我还以为要用反序列化)

从这个地方开始有输出,但是要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_第2张图片

可见是正确的

二和三只能满足一个,先看看第三个

法一:

?flag=flag&is=flag

Mark loves cat_第3张图片

 但是is=flag放在POST里就没用了,不知道为什么

Mark loves cat_第4张图片

 法二:

看下第二个的

?yds=flag

Mark loves cat_第5张图片

 

你可能感兴趣的:(网络安全)