主要考察变量覆盖漏洞
先扫目录,扫到.git,用git_extract还原。
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
首先正常情况,会发现底端输出了一个dog,也就是说在第二处if时断掉了,那么传入一个flag变量,结果发现底部变成了the flag is:
,然而后面什么都没显示,原因是因为上面的foreach将flag变量覆盖了:
?flag=1 ==> $flag=$1
显然$1
是不存在的,那么如果传递flag=flag
呢,这样就会触发最下面的$_GET['flag'] === 'flag'
判断,输出cat。但是如果再传入is,让其被flag的值覆盖,最后输出的就是flag了。
payload:
index.php?flag=flag&is=flag