欢迎新同学的光临
… …
人若无名,便可专心练剑
我不是一条咸鱼,而是一条死鱼啊!
变量覆盖漏洞
变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击
简介
变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:extract(), parse_str()和import_request_variables()
通常来说,单独的变量覆盖漏洞很难有利用价值,需要和其他漏洞结合起来才能完成攻击
extract()函数
先看看extract()函数说明:
extract(array,extract_rules,prefix)
函数从数组中将变量导入到当前的符号表,即将数组中的键值对注册成函数,使用数组键名作为变量名,使用数组键值作为变量值
该函数的变量覆盖隐患就出在第二个参数上面:
当第二个参数为空或者EXTR_OVERWRITE时,变量注册如果遇到冲突会直接覆盖掉原变量。
当第二个变量为EXTR_IF_EXISTS时,仅当原变量已存在是对其进行更新,否则不注册新变量。
extract.php 代码如下:
<?php
header("Content-Type: text/html; charset=utf-8");
$a = 1;
print_r("extract()执行之前:\$a = ".$a."<br />");
$b = array('a'=>'2');
extract($b);
print_r("extract()执行之后:\$a = ".$a."<br />");
?>
打开浏览器输入:http://192.168.161.133/VariCover/extract.php
parse_strc()函数
parse_str(string,array)
函数把查询字符串解析并注册为变量,主要用于页面之间传值(参数)
该函数在注册变量之前不会验证当前变量是否已存在,如果存在会直接覆盖
parse_str.php
<?php
$a = 1;
print_r("parse_str()执行之前:\$a = ".$a."<br />");
parse_str("a=2");
print_r("parsr_str()执行之后:\$a = ".$a."<br />");
?>
打开浏览器,输入url:http://192.168.161.133/VariCover/extract.php
import_request_variables()函数
import_request_variables ( string $types , string $prefix )
将 GET/POST/Cookie 变量导入到全局作用域中, types 参数指定需要导入的变量,
G代表GET,P代表POST,C代表COOKIE
import_request_variables.php
<?php
$a = 1;//原变量值为1
import_request_variables('GP'); //传入参数是注册变量
print_r($a); //输出结果会变成传入参数
?>
值得注意的是:import_request_variables()函数函数只能用在 PHP4.1 ~ PHP5.4之间,额外以上三种函数,使用时请格外注意,否则非常容易出现变量覆盖漏洞。
漏洞利用
我们应该已经理解了变量覆盖是怎么发生的,但是否还在疑惑这种漏洞是如何利用的?又会造成怎样的危害呢? 正如之前所说,单独的变量覆盖漏洞不易实现完整的攻击,但是这种漏洞的利用上限非常高,配合上其他漏洞,会有意想不到的效果。 比如,齐博CMS变量覆盖导致sql注入漏洞、metinfo变量覆盖漏洞导致任意文件包含,有兴趣的同学可以自行百度了解详情,这里就点到为止
漏洞防范
extract()函数防御
将extract.php中extract()函数第二个参数修改为extr_skip
<?php
header("Content-Type: text/html; charset=utf-8");
$a = 1;
print_r("extract()执行之前:\$a = ".$a."<br />");
$b = array('a'=>'2');
extract($b,extr_skip);
print_r("extract()执行之后:\$a = ".$a."<br />");
?>
再加载该页面,可以看到变量没有再被覆盖
parse_str()函数防御
parse_str()函数的防范,只能我们自己添加判断语句,比如:
<?php
header("Content-Type: text/html; charset=utf-8");
$a = 1;
print_r("parse_str()执行之前:\$a = ".$a."<br />");
if(!isset($a)){
parse_str("a=2");
}
print_r("parsr_str()执行之后:\$a = ".$a."<br />");
?>
再加载该页面,可以看到变量不再会被覆盖
import_request_variables()函数防御
此函数是非常危险的函数,在PHP5.5之后已被官方删除!假如你任然在使用低版本的PHP环境,也建议你避免使用此函数
参考链接:https://www.shiyanlou.com/courses/895
我自横刀向天笑,去留肝胆两昆仑