变量覆盖漏洞

作者: Jewel591 | 来源:发表于2018-03-29 14:55 被阅读12次

一、漏洞简介

变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。

变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:extract(), parse_str()和import_request_variables()

通常来说,单独的变量覆盖漏洞很难有利用价值,需要和其他漏洞结合起来才能完成攻击

二、漏洞原理

2.1 extract()函数

先看看 extract() 函数说明:

    
     extract(array,extract_rules,prefix)
     
函数从数组中将变量导入到当前的符号表,即将数组中的键值对注册成函数,使用数组键名作为变量名,使用数组键值作为变量值。

该函数的变量覆盖隐患就出在第二个参数上面:

  • 当第二个参数为空或者 EXTR_OVERWRITE 时,变量注册如果遇到冲突会直接覆盖掉原变量。

  • 当第二个变量为 EXTR_IF_EXISTS 时,仅当原变量已存在是对其进行更新,否则不注册新变量。

示例代码如下:

<?php
$a = 1;
print_r("extract()执行之前:\$a = ".$a."<br />");
$b = array('a'=>'2');
extract($b);
print_r("extract()执行之后:\$a = ".$a."<br />");
?>

Firefox中加载此页面:

此处输入图片的描述

可以看到extract()函数执行之后,将变量$a的值覆盖,


2.2 parse_str()函数

parse_str()函数说明:

    
     parse_str(string,array)
     
函数把查询字符串解析并注册为变量,主要用于页面之间传值(参数)。

该函数在注册变量之前不会验证当前变量是否已存在,如果存在会直接覆盖。

示例代码如下:

<?php
$a = 1;
print_r("parse_str()执行之前:\$a = ".$a."<br />");
parse_str("a=2");
print_r("parsr_str()执行之后:\$a = ".$a."<br />");
?>

Firefox 中打开此页面 :

image

可以看到,变量 $a 的值被覆盖。


2.3 import_request_variables() 函数

import_request_variables() 函数说明:

    
     import_request_variables ( string $types , string $prefix )
     
将 GET/POST/Cookie 变量导入到全局作用域中, types 参数指定需要导入的变量, G代表GET,P代表POST,C代表COOKIE.

示例代码:

<?php
$a = 1;    
import_request_variables('GP');   
print_r($a);  
?>

此页面当使用GET或POST传递$a变量时,会将原变量的值覆盖。

值得注意的是:此函数只能用在 PHP4.1 ~ PHP5.4之间。

三、变量覆盖漏洞防范

3.1 extract()函数防御

将 extract.php 中 extract() 函数第二个参数修改为 extr_skip :

<?php
$a = 1;
print_r("extract()执行之前:\$a = ".$a."<br />");
$b = array('a'=>'2');
extract($b,extr_skip);
print_r("extract()执行之后:\$a = ".$a."<br />");
?>

再次运行之后,可以看到变量没有再被覆盖:

image

parse_str()函数防御

parse_str() 函数的防范,只能我们自己添加判断语句,比如:

<?php
$a = 1;
print_r("parse_str()执行之前:\$a = ".$a."<br />");
if(!isset($a)){
    parse_str("a=2");
}
print_r("parsr_str()执行之后:\$a = ".$a."<br />");
?>

再加载该页面,可以看到变量不再会被覆盖。

image

3.3 import_request_variables() 函数防御

此函数是非常危险的函数,在PHP5.5之后已被官方删除,假如你任然在使用低版本的PHP环境,也建议你避免使用此函数。

四、建议

相关课程的线上实验版本已投递到实验楼,建议有兴趣的朋友可以看看:点击前往

相关文章

  • CTF之php变量覆盖漏洞

    什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有:$$使用不当,...

  • 变量覆盖漏洞

    一、漏洞简介 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现...

  • web 通用型漏洞学习

    web通用型漏洞学习 变量覆盖 原理:把自定义的参数值 替换为变量的参数值,从而覆盖了变量值,产生漏洞。 常见的...

  • (深入)变量覆盖漏洞

    可能引发变量覆盖漏洞的函数: extract() 将数组键名作为变量名,数组键值作为变量值 parse_str()...

  • 【白帽子】变量覆盖漏洞

    0x01 全局变量覆盖 变量若未被初始化(PHP中使用变量并不需要初始化),且能被用户控制,很可能导致安全问题 当...

  • MetInfo 管理员密码重置

    发布时间:2016-08-25 公开时间:N/A 漏洞类型:变量覆盖 危害等级:高 漏洞编号:xianzhi-20...

  • Destoon 任意文件读取

    发布时间:2016-08-29 公开时间:N/A 漏洞类型:变量覆盖 危害等级:高 漏洞编号:xianzhi-20...

  • PHPCMS 系统邮箱信息泄露

    发布时间:2016-09-03 公开时间:N/A 漏洞类型:变量覆盖 危害等级:高 漏洞编号:xianzhi-20...

  • PHPCMS 前台注入/任意文件读取

    发布时间:2016-09-04 公开时间:N/A 漏洞类型:变量覆盖 危害等级:高 漏洞编号:xianzhi-20...

  • extract函数

    extract函数最容易出现的就是变量覆盖的漏洞,该函数使用数组的键名作为变量名,键值作为变量值, 例如:

网友评论

    本文标题:变量覆盖漏洞

    本文链接:https://www.haomeiwen.com/subject/kybmcftx.html