Bugku-extract变量覆盖

先看题目代码

<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>

题目信息:

1.extract() 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。
针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。

可能的值:
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。

在本题中,因为有if判断,所以要构造‘shiyan’参数,使用extract($_GET)意思即为:
$shiyan = 参数

2.trim() 函数移除字符串两侧的空白字符或其他预定义字符。
可选参数;规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符:

"\0" - NULL
"\t" - 制表符
"\n" - 换行
"\x0B" - 垂直制表符
"\r" - 回车
" " - 空格

3.file_get_contents() 函数把整个文件读入一个字符串中。

则:

1.当不存在以$flag的值为名的文件时,trim(file_get_contents($flag)) === ‘’;因此两个空字符串比较会返回1,即会输出flag,因此可在网址后添加参数

?shiyan

即可输出flag

2.可以使用变量的引用:

?shiyan=&flag