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变量了
  • 相关阅读:
    Tornado @tornado.gen.coroutine 与 yield
    ThreadPoolExecutor执行任务,异常日志缺失问题
    Mybatis关联查询<association> 和 <collection>
    Spring整合mybatis
    Jedis操作Redis--Key操作
    Jedis操作Redis--SortedSet类型
    Jedis操作Redis--Set类型
    同义词 “stop from”,“keep from”和“prevent from”的区别
    test
    Python win32gui调用窗口到最前面
  • 原文地址:https://www.cnblogs.com/milantgh/p/4064658.html
Copyright © 2011-2022 走看看