php 全局变量漏洞的点滴分析
php的全局变量存在漏洞,这一点,你是否有了解呢?
Discuz中有这样一句:
exit('Request tainting attempted.');
}
register_globals 是php中的一个控制选项,可以设置成off或者on ,默认为off,决定是否将 EGPCS(Environment,GET,POST,Cookie,Server)变量注册为全局变量。
如果 register_globals打开的话, 客户端提交的数据中含有GLOBALS变量名, 就会覆盖服务器上的$GLOBALS变量。
所以 这段代码, 就是判断, 如果提交的数据中有GLOBALS变量名, 就终止程序。
由此引起的安全问题成为PHP的“自动全局变量漏洞”,请一定要关掉register_globals选项。并且使用 $_GET, $_POST, $_COOKIE 而非 $_REQUEST 。
Discuz!论坛绕过全局变量防御漏洞
由于php5.3.x版本php.ini的设置中 request_order 默认值为 GP ,导致Discuz! 6.x/7.x中可以绕过全局变量防御。
在include/global.func.php中:
!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
return $string;
}
include/common.inc.php中:
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
在register_globals=on时通过提交GLOBALS变量就可以绕过上面的代码。
Discuz!中提供的防范方法:
exit('Request tainting attempted.');
}
$_REQUEST超全局变量的值受php.ini中request_order的影响,在最新的php5.3中,request_order默认值为GP,即默认配置下$_REQUEST只包含$_GET和$_POST而不包括$_COOKIE。
借助COOKIE即可提交GLOBALS变量。
临时解决方法:
更改php 5.3.x里的php.ini设置,设置 request_order 为 GPC。
有关php中全局变量的漏洞与临时解决方法,就介绍这些了,希望对大家有所帮助吧。
您可能感兴趣的文章:
php 全局变量漏洞的点滴分析
临时解决办法:360提示DedeCms全局变量覆盖漏洞
网站安全必须做的几点
web安全之文件上传漏洞攻击与防范方法
PHP漏洞中的战争
php代码审计需要会php吗
photoshop设计一个水滴主题UI图标绘制教程
ThinkPHP5核心类Request远程代码漏洞分析
php中strtotime()与mktime() 的Y2K38漏洞 2038年问题
360安全卫士高危漏洞提示怎么关闭?