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!中有如下代碼:
 
if (isset($_REQUEST[‘GLOBALS’]) OR isset($_FILES[‘GLOBALS’])) {
    exit(‘Request tainting attempted.’);
}
 
$_REQUEST這個超全局變量的值受php.ini中request_order的影響,在最新的php5.3.x系列中,request_order默認值為GP,也就是說默認配置下$_REQUEST只包含$_GET和$_POST而不包括$_COOKIE。通過COOKIE就可以提交GLOBALS變量。
 
臨時解決方法:
 
更改php 5.3.x里的php.ini設置,設置request_order 為GPC 。
 
補充:
string substr ( string string, int start [, int length] )
其中start如果為負,則從字符串最后一個字符開始向回倒數到start字符,作為起始點。
如果length為負,則從字符串最后一個字符開始向回倒數到length字符,作為終點。
其中,如果字符串長度小於或等於start,則返回false。
如果起點位置超過終點位置,則返回一個空字符串。
 
set_magic_quotes_runtime(0)
在php.ini的配置文件中,有個布爾值的設置,就是magic_quotes_runtime,當它打開時,php的大部分函數自動的給從外部引入的(包括數據庫或者文件)數據中的溢出字符加上反斜線。
當然如果重復給溢出字符加反斜線,那么字符串中就會有多個反斜線,所以這時就要用set_magic_quotes_runtime()與get_magic_quotes_runtime()設置和檢測php.ini文件中magic_quotes_runtime狀態。
為了使自己的程序不管服務器是什么設置都能正常執行。可以在程序開始用get_magic_quotes_runtime檢測設置狀態秋決定是否要手工處理,或者在開始(或不需要自動轉義的時候)用set_magic_quotes_runtime(0)關掉。
magic_quotes_gpc設置是否自動為GPC(get,post,cookie)傳來的數據中的'”加上反斜線。可以用get_magic_quotes_gpc()檢測系統設置。如果沒有打開這項設置,可以使用addslashes()函數添加,它的功能就是給數據庫查詢語句等的需要在某些字符前加上了反斜線。這些字符是單引號(’)、雙引號(”)、反斜線()與 NUL(NULL 字符)。
 
error_reporting(0)
// Turn off all error reporting
error_reporting(0);
即關閉所有錯誤輸出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM