标签归档:变量覆盖

【代码审计】变量覆盖漏洞总结

1、$$变量覆盖:
很经典的一个例子
<?php
    $a=1;
    foreach (array("_COOKIE","_POST","_GET") as $request) {
        foreach ($$request as $key => $value) {
            echo $key."</br>";
            $$key = addslashes($value);
        }
    }
    echo $a;
?>

2、函数使用不当
1)int extract( array &$var_array , int $extract_type = EXTR_OVERWRITE , string $prefix = null )

运行代码:
<?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

定义和用法
extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。
该函数返回成功导入到符号表中的变量数目。
extract(array,extract_rules,prefix)
extract_rules的默认值为EXTR_OVERWRITE,表示如果有冲突,则覆盖已有的变量。

2)void parse_str( string $str , array &$arr )
parse_str() 函数把查询字符串解析到变量中。
语法
  parse_str(string,array)
参数
  string 必需。规定要解析的字符串。
  array 可选。规定存储变量的数组名称。该参数指示变量存储到数组中。

3)bool import_request_variables( string $type , string $prefix )
import_request_variables 函数可以在 register_global = off 时,把 GET/POST/Cookie 变量导入全局作用域中。
bool import_request_variables ( string types [, string prefix])  

参数中types字符串中允许为g、p、c字符,或者3个字符间任意的组合。其中,“g”表示GET变量,“p”表示POST变量,“c”表示cookies。注意:3个字符的排列顺序是有区别的,当使用“pg”时,POST变量将使用相同的名字覆盖$_GET变量;反之,当使用“gp”时,$_GET变量数组将优先于$_POST。

prefix 参数作为变量名的前缀,置于所有被导入到全局作用域的变量之前。所以如果你有个名为“userid”的 GET 变量,同时提供了“pref_”作为前缀,那么你将获得一个名为 $pref_userid 的全局变量。
注: 虽然 prefix 参数是可选的,但如果不指定前缀,或者指定一个空字符串作为前缀,你将获得一个 E_NOTICE 级别的错误。使用默认错误报告级别是不显示注意(Notice)级别的错误的。