1. 程式人生 > >織夢dedesql.class.php檔案漏洞解決方法

織夢dedesql.class.php檔案漏洞解決方法

阿里雲後臺提示織夢dedesql.class.php檔案變數覆蓋漏洞會導致SQL注入,可被攻擊者構造惡意SQL語句,重置管理員密碼,寫入webshell等,進而獲取伺服器許可權。下面告訴大家怎麼修復這個漏洞:

首先說一下dedecms不安全的引數處理機制,這裡我們看一下/include/common.inc.php程式碼的第106行:

萬惡之源其實就在這裡,基本上目前dede被發現的漏洞全都死在這裡。我們可以看到,程式從GPC陣列中取出名值對後,只是對$_v做了簡單的addslashes處理,就直接賦給了${$_k},實現了類似全域性變數覆蓋的機制,設計的初衷是為了開發方便,但卻存在著嚴重的安全問題。PHP在經歷了這麼多年的更新換代終於修補了register_globals問題,但是dede的這段程式碼使php付出的努力全部白費。

下面我們迴歸漏洞。首先是/include/dedesql.class.php的第595-607行,

在執行這段程式碼之前,程式未初始化$arrs1和$arrs2這兩個陣列。結合前面提到的dede不安全的引數處理機制,利用這段程式碼我們可以覆蓋任意全域性變數。例如在這個漏洞中,我們可以控制$GLOBALS['cfg_dbprefix']的值。

解決方案:

修改/include/dedesql.class.php頁面第595行,新增程式碼如下

$arrs1 = array(); 
$arrs2 = array();
//特殊操作
        $arrs1 = array(); $arrs2 = array(); if (isset($global['arrs1']))
        {
            $v1 = $v2 = '';
            for ($i=0;isset($arrs1[$i]);$i++) 
            { 
                $v1 .= chr($arrs1[$i]);
            }
                        $v1 = $v2 = '';
            for ($i=0;isset($arrs2[$i]);$i++) 
            { 
                $v2 .= chr($arrs2[$i]);
            }
            $global[$v1] . = $v2; 
        }