0%

变量覆盖

变量覆盖

攻击

使用自定义的参数值去覆盖替换程序原有的变量值。

涉及函数: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

Buy me a coffee.

欢迎关注我的其它发布渠道