zoukankan      html  css  js  c++  java
  • Discuz! 6.x/7.x 全局变量防御绕过漏洞

    受影响产品:

    Discuz! 6.x/7.x 

    漏洞描述:

    由于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功能的代码,在GPC为off时会调用addslashes()函数处理变量值,但是如果直接使用$_GET/$_POST/$_COOKIE这样的变量,这个就不起作用了,然而dz的源码里直接使用$_GET/$_POST/$_COOKIE的地方很少,存在漏洞的地方更加少:(
    
    不过还有其他的绕过方法,在register_globals=on下通过提交GLOBALS变量就可以绕过上面的代码了.为了防止这种情况,dz中有如下代码:
    
    if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
    	exit('Request tainting attempted.');
    }
    
    这样就没法提交GLOBALS变量了么?
    
    $_REQUEST这个超全局变量的值受php.ini中request_order的影响,在最新的php5.3.x系列中,request_order默认值为GP,也就是说默认配置下$_REQUEST只包含$_GET和$_POST,而不包括$_COOKIE,那么我们就可以通过COOKIE来提交GLOBALS变量了
  • 相关阅读:
    加入创业公司有什么利弊
    Find Minimum in Rotated Sorted Array II
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Find Minimum in Rotated Sorted Array
    Remove Duplicates from Sorted Array
    Spiral Matrix
    Spiral Matrix II
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/milantgh/p/4064658.html
Copyright © 2011-2022 走看看