Variable-Cover

 · 2019-12-18 · 次阅读


初识变量覆盖

变量覆盖我个人的理解就是攻击者利用一些手段改变了程序中定义了变量的值。

parse_str()

首先说一下parse\_str()这个函数,这函数是把传入的string类型的参数,直接作为变量使用,当然可以设置第二个参数,这样会存入固定的数组中,下面看一个它的例子: ```php $a=123; parse_str($_GET['b']); echo $a; ```

这里当我们在url中输入b=a=abc时,页面上打印的竟然变成了abc.这就叫做变量覆盖。
当我们传入参数后,原来的语句就变成了parse_str(‘a=abc’),这时候根据函数parse_str的功能就会自动创建$a=abc,导致原来的$a的值被覆盖掉。

$$的使用

前文在复习php时候说过$$是可变变量,这样的使用同样会造成变量覆盖漏洞,下面同样举个简单的例子:
<?php
$fmodule='i like you';
echo $fmodule;
foreach(array('_GET','_POST','_COOKIE')as $_request){
    foreach($$_request as $_key=>$_value)
    {
        $$_key=$_value;
    }
}
echo '<br>';
echo $fmodule;
?>

该程序显示结果为:

i like you
i like you

当我们在url中传参数fmodule=i don’t like you时,页面显示效果如图所示:

extract()

extract()函数能够将变量从数组导入到当前的符号表,我们先看一下他的用法: ```extract int extract ( array $var_array [, int $extract_type [, string $prefix ]] ) ``` 第二个参数指定函数将变量导入符号表时的行为,当值为EXTR_OVERWRITE时,在将变量导入符号表的过程中,如果变量名发生冲突,则覆盖所有变量;值为EXTR_SKIP则表示跳过不覆盖。当第二个参数未指定时默认为前者覆盖。 ```php if ($auth == 1) {
echo “Yes,success”;
} else {
echo “No,falid”;
}
?>

同样该程序在URL中传入auth=1时会直接覆盖掉原值,导致输出Yes,success

<h3><font color=orange>import_request_variables</font></h3>
该函数将GET、POST、COOkies中的变量导入到全局该函数的变量覆盖漏洞例子如下所示:
```php
<?php
$id = "0";
import_request_variables("G");

if ($id == 1) {
  echo "private!";
} else {
  echo "public!";
}
?>

上面的G代表get传入,当我们同样在url中传入id=1时,页面输出private.