引子
先看一段php代码
1 |
|
通过url传入name变量为555之后结果:
解析:这里由于$$a=$($a)=$aa,因此赋值时将name的值赋值给了$aa,造成了变量覆盖漏洞
register_globals(全局变量覆盖)
register_globals
是php.ini中的一个选项,从PHP 5.3.0起不推荐使用。在PHP 5.4.0中移除该选项
该变量的作用是将传入的变量注册为全局变量,但是注册过的变量不会被覆盖
1 |
|
这里之前没有给$a赋值,但是开启了register_globals选项之后,通过URL传值$a却有了值。
但是当a本身有值再赋值的话就会失败
1 |
|
extract()
extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。extract(array,extract_rules,perfix)
下面看php代码
1 |
|
如果想要确保不会覆盖已有的变量可以使用EXTR_SKIP
参数
遍历初始化变量
一些以变量释放方式执行的代码可能会导致已有变量被覆盖
1 |
|
如果此时提交参数名为chs,那么就可以改变$chs的值,变量遍历初始化漏洞其实就是引子里面的错误用法
import_request_variables变量覆盖
import_request_variables函数可以在register_globals关闭的时候把GET/POST/COOKIE变量导入全局作用域当中
- bool import_request_variables ( string types [, string prefix])
用法:1
2
3
import_request_variables("gpc");
parse_str()变量覆盖
parse_str()用于把查询字符串解析到变量中:
1 |
|
1 | //var.php?var=new |
$_SERVER[‘QUERY_STRING’]用法:
与parse_str()类似的还有mb_parse_str()