extract变量覆盖

extract()函数

extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。该函数返回成功设置的变量数目。

实例

将键值 “Cat”、”Dog” 和 “Horse” 赋值给变量 $a$b$c

1
2
3
4
5
6
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "$a = $a; $b = $b; $c = $c";
?>

运行结果为:

1
$a = Cat; $b = Dog; $c = Horse

更多extract函数细节请参考->链接

extract()变量覆盖1

题目源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>

URL 通过 get 的方式传参,传输的数据以数组的形式被封装在$_GET 中;extract()函数从数组中将变量导入到当前的符号表,该函数使用数组键名作为变量名,使用数组键值作为变量值;isset()函数判断是否存在变量$shiyan;trim()函数移除字符串两侧的空白字符或其他预定义字符 ,这里是移除字符串两侧的空格;file_get_contents()函数将整个文件读入一个字符串;假如$shiyan的值等于文件的内容($content)时,就打印出flag

解题方法:

GET请求: ?flag=&gift=

extract()会将$flag$shiyan的值覆盖了,将变量的值设置为空或者不存在的文件就满足$shiyan== $content

extract()变量覆盖2

题目源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php if ($_SERVER["REQUEST_METHOD"] == “POST”) { ?>

<?php

extract($_POST);

if ($pass == $thepassword_123) { ?>

<div class=”alert alert-success”>

<code><?php echo $theflag; ?></code>

</div>

<?php } ?>

<?php } ?>

这次要使用POST的方法提交数据,extract($_POST)会将POST的数据中的键名和键值转换为相应的变量名和变量值,此时利用extract()函数覆盖$pass$thepassword_123的值,使$pass == $thepassword_123即可得到flag

所以只要以POST的方法提交pass=&thepassword_123= 即可。