变量覆盖
攻击
使用自定义的参数值去覆盖替换程序原有的变量值。
涉及函数:extract parse_str import_request_variables——php5.4版本以上已被弃用 $$
extract函数
该函数将一个数组注册成变量,每一对键值对对应一组变量。
int extract (array,options,prefix)
第一个参数为一个数组,为被操作量,第二个参数限定了变量注册的规则。当第二个参数为
1 | <?phpecho "<meta http-equiv='content-type' content='text/html;charset=utf-8'>";//extract$a=10;echo '覆盖前$a:'.$a.'</br>';$o=array('a'=>20,'b'=>30);extract($o);echo '覆盖后$a:'.$a.'</br>';echo '新注册变量$b:'.$b.'</br>'; |
parse_str函数
解析字符串注册变量,在注册变量之前不会验证它是否已经存在,所以会直接覆盖到之前的变量。
void parse_str(string,array)
第一个参数是要注册的字符串,形式为a=1
会被注册为$a=1
,当第二个参数存在的时候,该变量会被注册为一个数组。如果这个数组原本就存在相同的键,则会覆盖掉原有的键
1 | //parse_str//注册变量$d=111;echo 'parse_str覆盖前$d:'.$d.'</br>';parse_str('d=666');echo 'parse_str覆盖后$d:'.$d.'</br>';//注册数组parse_str('d=8888',$g);echo 'parse_str注册数组覆盖后$d:'.$d.'</br>';var_dump('parse_str覆盖后$g:'.$g.'</br>');echo $g['d']; |
import_request_variables函数
报get、post、cookie中的参数注册为变量,用在在register_globals被禁止的时候,因为存在安全风险,现在已经不建议使用。
bool import_request_variables(types,prefix)
types GPC
prefix 前缀
1 | $h=11;//import_request_variables('GP'); //已启用echo $h; |
$$变量覆盖
1 | <?php$a=10;echo $a;echo '</br>';foreach ($_POST as $key=>$value){ $$key=$value; echo $a;} |
通过变量覆盖,我们可以直接覆盖所有之前的变量,比如说存在一天sql语句这么写的
select * from {$test} where name='armandhe'
那么可以覆盖$test,传入
?test=mysql.user limit 1%23
这样就形成了sql注入
也可以直接注入xss
如果后台存在
echo $a
覆盖
?a=<script>alert(document.cookie)</script>
防御
使用原始变量,$_GET等,不要玩花的。
注册变量前,先验证变量是否存在。
同一加前缀
自行定义的变量一定要记住初始化, 不然即便注册变量的代码在最前面也会覆盖这些未初始化的变量。
关闭 register_globals