background image

php 全局变量漏洞 $GLOBALS

Discuz 代码中有这么一段:

if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
 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 中:

 
function daddslashes($string, $force = 0) {
 

 

 

 !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(array('_COOKIE', '_POST', '_GET') as $_request) {
    foreach($$_request as $_key => $_value) {
        $_key{0} != '_' && $$_key = daddslashes($_value);
    }
}
 

register_globals=on 时通过提交 GLOBALS 变量就可以绕过上面的代码。为了防范这种情

况,

Discuz!中有如下代码: