extract覆盖
这道题首先给出了源码
<?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';
}
}
?>
下面分析代码的含义
它定义了变量flag为“xxx",通过get方式得到变量值。
下面判断了是否存在"shiyan"这个变量。
下一句是将flag这个文件里的内容直接赋给content这个变量并且去除这个变量的空格等其他字符
如果shiyan==content就会给出flag
否则输出no no
关键php代码解释:
extract是覆盖变量,它能从数组里得到变量值,如果与现有的变量名称冲突,就会根据参数进行覆盖或者其他,默认为覆盖。
int extract( array &$array[, int $flags = EXTR_OVERWRITE[, string $prefix = NULL]] )
本函数用来将变量从数组中导入到当前的符号表中。 对待非法/数字和冲突的键名的方法将根据取出标记 flags 参数决定。可以是以下值之一: EXTR_OVERWRITE如果有冲突,覆盖已有的变量。 EXTR_SKIP如果有冲突,不覆盖已有的变量。 EXTR_PREFIX_SAME如果有冲突,在变量名前加上前缀 prefix。 EXTR_PREFIX_ALL给所有变量名加上前缀 prefix。 EXTR_PREFIX_INVALID仅在非法/数字的变量名前加上前缀 prefix。 EXTR_IF_EXISTS仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。举个例子,以下情况非常有用:定义一些有效变量,然后从 $_REQUEST 中仅导入这些已定义的变量。 EXTR_PREFIX_IF_EXISTS仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。 EXTR_REFS将变量作为引用提取。这有力地表明了导入的变量仍然引用了 array 参数的值。可以单独使用这个标志或者在 flags 中用 OR 与其它任何标志结合使用。如果没有指定 flags,则被假定为 EXTR_OVERWRITE。
prefix
注意 prefix 仅在 flags 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
issert($变量名)
issert函数判断是否存在这个变量且变量不为null的时候返回1,否则返回0
file_get_content(文件名)
将一个文件以字符串的形式读入一个变量,如果没有或者找不到这个文件就返回false
这里采用这种方式,flag这个文件让它找不到,返回值为0,那么只需要将shiyan这个变量的返回值也为0就可以了,方法是将flag这个变量随便赋值,而shiyan这个变量置空
payload
http://123.206.87.240:9009/1.php?shiyan=&flag=renyi.txt