函数:

$$
extract()
parse_str()
import_request_variables()(函数用在没有完成开启全局变量,只能用在php5.4之前,之后这个函数取消了)

0×01 $$导致的变量覆盖问题

使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。因此就产生了变量覆盖漏洞。请求?id=1 会将$id的值覆盖,$id=1。

<?php foreach (array(‘_COOKIE’,’_POST’,’_GET’) as $_request)
{ foreach ($$_request as $_key=>$_value)
{ $$_key= $_value; } } $id = isset($id) ? $id : 2; if($id == 1) { echo “flag{xxxxxxxxxx}”; die(); } echo $id; ?>

0×02 extract()变量覆盖

  extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。源自:http://www.w3school.com.cn/php/func_array_extract.asp
代码示例1:
将键值 “Cat”、”Dog” 和 “Horse” 赋值给变量 $a、$b 和 $c:

<?php $a = “Original”; $my_array = array(“a” => “Cat”,”b” => “Dog”, “c” => “Horse”); extract($my_array); echo “\$a = $a; \$b = $b; \$c = $c”; ?> //运行结果:$a = Cat; $b = Dog; $c = Horse

代码示例2:

<?php $id=1;
extract($_GET); echo $id; ?> //提交:?id=123 //结果: 123

tips: 在调用extract()时使用EXTR_SKIP保证已有变量不会被覆盖 extract($_GET,EXTR_SKIP);

0×03 parse_str()变量覆盖

parse_str() 函数把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。
用法参考: http://www.w3school.com.cn/php/func_string_parse_str.asp
代码示例一:

  1. > parse_str("a=1");
  2. > echo $a."
    "; //$a=1
  3. > parse_str("b=1&c=2",$myArray);
  4. > print_r($myArray); //Array ( [c] => 1 [b] => 2 )
  5. > ?>

tips:parse_str() 类似的函数还有 mb_parse_str(),用法基本一致。

0×04 import_request_variables 变量覆盖

import_request_variables 函数可以在 register_global = off 时,把 GET/POST/Cookie 变量导入全局作用域中。

  1. > import_request_variables("g", "get_");
  2. > echo $get_id;
  3. > ?>
  4. > //提交:?id=111
  5. > //结构:111