PHP变量覆盖漏洞小结

时间:2022-07-25
本文章向大家介绍PHP变量覆盖漏洞小结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

变量覆盖漏洞是需要我们需要值得注意的一个漏洞,下面就对变量覆盖漏洞进行一个小总结。

变量覆盖概述

变量覆盖指的是可以用我们自定义的参数值替换程序原有的变量值,通常需要结合程序的其他功能来实现完整攻击。那么它是如何引起的?其实,大多数变量覆盖漏洞是函数使用不当导致的。比如extract()函数和parse_str()。还有一个函数是import_request_variables(),它是在没有开启全局变量注册的时候,调用这个函数相当于开启了全局变量注册,在PHP5.4之后,这个函数被取消了。还有一种是利用$$的方式来注册变量,但是没有验证已有变量,导致被覆盖。

extract()函数使用不当导致变量覆盖

函数结构: int extract( array &

<?php
$b=2;
$a=array('b'=>'123');
extract($a);
echo $b;
?>

原来b=2,经过extract()函数对a处理后,

parse_str()函数使用不当导致变量覆盖

parse_str()函数的作用是解析字符串并且注册成变量,它在注册变量之前不会验证当前变量是否存在,所以会直接覆盖掉原有变量。函数说明如下: void parse_str( string str[, array &

<?php
$b=2;
parse_str($b=321);
print_r($b);
?>

我们发现$b的值被覆盖为321。

$$变量覆盖

先看引起覆盖的一小段代码:

<?php
$a=1;
foreach (array('_COOKIE','_POST','_GET') as $_request){
    foreach ($$_request as $_key =>$_value){
        $$_key = addslashes($_value);
    }
}
echo $a;
?>

它为什么会导致变量覆盖呢?重点在$符号,从代码中,我们可以看出_key为COOKIR、POST、GET中的参数,如果我们提交?a=3,那么key的值就为3,还有一个在a的前面,结合起来就是a=addslashes(_value),所以会覆盖原有a的值。上面的代码我们执行一下,如下图,发现a被覆盖成由GET方式传的8。

变量覆盖防范

变量覆盖最常见的漏洞点是做变量注册时没有验证变量是否存在。所以想要防范,推荐使用原始的变量数组,如_GET、_POST等,或者在注册变量前一定要验证变量是否存在。