文章目录
前言: 这又是一道 git 泄露的问题,这是本周遇到的第二道,很遗憾对于 git 泄露的问题我至今还没有入门,甚至基本的原理也不知道,所以这是一件很棘手的事情,我已经计划在本周日,对本周学习的所有知识点来个套餐
-
打开网页,可以说是把网页看了一遍所有能想到的都想了,认为怎么可能有漏洞?这一个测试点都没有,然后就开始看网上的 wp
-
网上教程告诉是 git 泄露的问题,这直接就是在使用 githack 进行获取,链接为: 网页后面加一句 .git 就可以了,获取到源代码后进行审计
<?php include 'flag.php'; $yds = "dog"; $is = "cat"; $handsome = 'yds'; foreach($_POST as $x => $y){ $$x = $y; //POST型声明至当前文件 } foreach($_GET as $x => $y){ $$x = $$y; //GET型变量重新赋值为当前文件变量中以其值为键名的值 } foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ //如果GET型中flag变量的值等于GET型中一个不为flag的键名则退出 exit($handsome); //exit显然能利用 } } //如果GET型和POST型中都没有变量flag,则退出 if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); } if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); } echo "the flag is: ".$flag; ?>
-
对代码进行审计后发现一句:
$$x = $$y;
这不是变量覆盖吗,这不就好起来了,现在对代码中的各大判断进行审计即可 -
foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ //如果GET型中flag变量的值等于GET型中一个不为flag的键名则退出 exit($handsome); //exit显然能利用 } }
这个判断就很变态,我思考了一番发现没有可以利用的,换一个判断
//如果GET型和POST型中都没有变量flag,则退出 if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); }
这个判断只需要不发送变量 flag 就可以,在 exit($yds); 使用的是 yds,这个可以利用前面的便来你覆盖试一下,我们发送
yds=flag
这个参数,在后台先使用foreach($_GET as $x => $y){ $$x = $$y; }
结果为: $yds=$flag
然后在去执行上面那一条 if 判断就可以进入,执行代码为exit($flag)
,对于 exit() 函数可能不会陌生,那这个 $flag 是什么?在代码最下面有一句echo "the flag is: ".$flag;
上面就是第一种解法,然后我们对最后一个 if 进行使用
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); }
这个怎么看起来和上面那个那么熟悉,唯一不一样的是上面 if 判断式判断上传的参数有没有 flag,而这个 if 判断是判断上传的参数中的 flag 的参数的值是不是 flag.最后的 exit() 执行的是 $is,那这不就和上面一样了吗?,直接 payload: is=flag&flag=flag\
总结:
写的有点乱,我也不知道是咋了