述:变量覆盖常日是利用外来参数更换初始化程序中原有变量的值。
一、extract函数利用不当
考虑如下代码:<?php$auth = false;extract($_GET);if($auth){echo "flag{....}";}else{echo "Access Denied.";}?>
此处的extract函数将GET传入的数据转换为变量名和变量的值,以是布局如下payload 即可将 $auth 的值变为true并得到flag:

?auth=1
二、parse_str 函数
考虑如下代码:<?php$auth = false;parse_str($_SERVER['QUERY_STRING']);if($auth){echo "flag{...}";}else{echo "Access Denied.";}?>
此处的parse_str函数同样也是将GET传入的字符串解析为变量,以是payload同上
三、import_request_variables函数 # 测试环境 5.4>php>=4.1
考虑如下代码:<?php$auth = false;import_request_variables('G');if ($auth){echo "flag{...}";}else{echo "Access Denied.";}?>
此处,import_request_variables函数的值由 G、P、C 三个字母组合而成,G代表GET,P代表POST,C代表Cookies。
注:参数GP,排在前面的字符会覆盖后面的字符传入的值。此时GET和POST同上传入auth参数,则POST传入的auth会被忽略。
四、register_globals=ON 配置不当, PHP版本须要小于5.4
<?phpif($auth){echo "flag{...}";}else{echo "Access Denied.";}?>
利用register_globals的特性,用户传入参数auth=1 即可进入if语句块
注:如果 if 前初始化 $auth 变量,则不会触发这个漏洞。
五、代码逻辑漏洞
<?php$foo = "hello"; //赋值普通变量$$foo = "world"; //利用foo变量的值作为可变变量的变量名echo "$foo ${$foo}"; //输出:hello worldecho "$foo $hello"; //等同上面语句?>
利用 foreach 遍历数组(如,$_GET、$_POST 等)来注册变量,这样也会存在变量覆盖漏洞的情形。
<?php$auth = false;foreach($_GET as $key => $value){$$key = $value;}if ($auth){echo "flag{...}";} else {echo "Access Denied.";}?>
此时的 foreach 循环就将 GET传入的参数注册为变量,传入 ”?auth=1“ 即可绕过判断