变量覆盖--代码审计php
这是个薄弱地方,因此此次学习一下,总结一下。html
变量覆盖漏洞:自定义的参数值替换原有变量值的状况称为变量覆盖漏洞数组
常常致使变量覆盖漏洞场景有:$$ 使用不当,extract() 函数使用不当,parse_str() 函数使用不当,import_request_variables() 使用不当,开启了全局变量注册函数
$$致使的变量覆盖学习
$$介绍
$$这种写法称为可变变量
一个可变变量获取了一个普通变量的值做为这个可变变量的变量名。spa
<?php
$a = "hello";
echo "$a"; //输出hello
$a="world";
echo "$a"; //输出hello
echo "$$a"; //输出word
echo "$a ${$a}"; //输出hello world
echo "$a $hello"; //输出hello world
?>
漏洞产生
使用 foreach 来遍历数组中的值,而后再将获取到的数组键名做为变量,数组中的键值做为变量的值。所以就产生了变量覆盖漏洞。code
<?php foreach ($_GET as $key => $value) { ${$key} = $value; } echo $a; ?>
get获得的数据$key和$value,关键第3行,${$key}用get传进来的$key作为新的变量,将get传进来的$value赋值给它。
get ?a=1 第3行会解析为$a=1。就形成了变量覆盖。htm
extract()函数致使的变量覆盖blog
extract() 该函数使用数组键名做为变量名,使用数组键值做为变量值。针对数组中的每一个元素,将在当前符号表中建立对应的一个变量。 字符串
extract()的用法参考:http://www.runoob.com/php/func-array-extract.html
parse_str函数致使的变量覆盖
parse_str() 函数用于把查询字符串解析到变量中,若是没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。