1.发生的条件
函数使用不当($$、extract()、parse_str()、import_request_variables()等)
开启全局变量
2.1定义
$$代表可变变量,就是说,一个变量的变量名可以动态的设置和使用。
eg:

<?php
$a = 'hello';
$$a = 'world!';
echo $a.'</br>'
echo $$a.'</br>'
echo $hello;
?>

变量a被定义成了字符串hello 而变量$a被定于成了字符串world!
但同时$a本身也是个变量
$$a就可以代表两个含义$($a)和$(hello) 两个变量
此时输出的结果:

hello
world!
world

2.2
extract()函数的定义
extract()可以从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值
语法结构:extract(array,extract_rules,prefix)
i.array为必选参数(此参数必须为数组型数据)
ii.extract_rules为可选参数,可选的值有:
● EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
● EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
● EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
● EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
● EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
● EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
● EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
● EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
iii.prefix为可选参数
eg:

<?php
$d = array('a' => 'cat','b' => 'dog' , 'c' => 'pig');
extract($d);
echo $a.'</br>';
echo $b.'</br>';
echo $c.'</br>';
?>

此时的输出结果为:

cat 
dog
pig

可以看到我们之前并未声明过a、b、c变量,但是仍可输出。
2.3 parse_str()函数的定义
把查询字符串解析到变量中
语法:parse_str(string,array)
string为必选参数
array为可选参数

<?php
parse_str("name=Bill&age=60");
echo $name."<br>";
echo $age;
?>

运行结果为:

Bill 
60

可以看到此函数将name和age初始化成了变量,且值为等号右边的值
当array参数存在时:

2.4 import_request_varibles()定义
将 GET/POST/Cookie 变量导入到全局作用域中
此函数相当于开启全局变量注册
语法import_request_variables(string $types ,string $prefix )
第一个参数为必选
第二个参数为可选
例子:
import_request_variables("GPC")
使用此方法即可开启对_POST、_GET、_COOKIE的全局变量注册
当第二个参数存在时将会加上一个前缀

  1. $$变量覆盖

    foreach(array('_COOKIE','_POST','_GET') as $_request) {

     foreach($$_request as $_key => $_value) {
         $$_key = addslashes($_value);
     }

    经典的$$注册变量导致的变量覆盖代码,很多应用上都出现过
    可以看出$_key为COOKIE POST GET中的参数
    比如提交?a=1 则$_key的值为a
    而下面的$$_key则会有$a的意思,结合起来就变成了$a = addslashes($_value)
    这样便会覆盖原有的变量a的值

  2. 变量覆盖一句话木马免拦截
    经过我们简单的测试,我们可以了解到:当我们使用assert函数时,如果函数的参数是可控,那么会被拦截。例如:assert($_POST[a])或者$a=$_POST[c];assert($a)这些都是拦截
    但是如果我们只有assert($a)这一句时,我们发现他就不会进行拦截了
    这个变量a是不可控的,所以就认为这不是木马

标签: none

暂无评论