logo头像

黑客的本质就是白嫖

web知识巩固(篇三)-变量覆盖

介绍

变量覆盖漏洞,ctf比赛中会比较常见,显示环境中在下基本上没见过(见识太少了),表现就是用自己提交的变量值覆盖后台代码处的变量值,并达到某些目的(获取flag等)

产生原因

开启了全局变量注册

register_globals

register_globalsphp.ini 中的一条设置,当该值为On时,用户提交的变量会直接作为全局变量,如果此时变量名与某个全局变量相同,则会将其值覆盖从而造成变量覆盖漏洞

php版本>4.2.0后,该值由之前的默认On改为了默认Off,而在php 5.3.0时起废弃并于php 5.4.0时移除

import_request_variables()函数

作用和上面的一样,函数原型如下

1
import_request_variables ( string $types [, string $prefix ] )

参数值有三个,分别是字母GPC,代表了GETPOSTCookie。字母不区分大小写

适用范围:4.1.0<php<5.4.0

$$ 双变量符

该操作一般出现于foreach语句中

1
2
3
foreach ($_GET as $key => $value) {
$$key = $value;
}

上面的代码作用是将获取到的数组键名作为变量名,并将键值作为值赋给变量,这种时候可以通过将键名设为某个存在的变量达到读取变量值的效果(如flag、配置信息等等)

extract()函数

这个函数类似于上面的$$,都是会将数组的键名作为变量名,键值作为变量值,下面是函数原型

1
extract(array,extract_rules,prefix)
参数 描述
array 必需。规定要使用的数组。
extract_rules 可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。
prefix 可选。请注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。

parse_str()函数

函数原型

1
parse_str(string,array)
参数 描述
string 必需。规定要解析的字符串。
array 可选。规定存储变量的数组名称。该参数指示变量存储到数组中。

原理都和上面的大同小异,与这个函数相似的还有一个函数mb_parse_str()

References

变量覆盖漏洞

使用 Register Globals

PHP变量覆盖总结

import_request_variables

评论系统未开启,无法评论!