Discuz! X 3.4 ML 任意代碼執行漏洞復現

0X1 漏洞概述

2019年7月11日,網絡上出現了一個Discuz!ML遠程代碼執行漏洞的PoC,研究員驗證分析發現,攻擊者能夠利用該漏洞在請求流量的cookie字段中(language參數)插入任意代碼,執行任意代碼,從而實現完全遠程接管整個服務器的目的,該漏洞利用方式簡單,危害性較大。漏洞影響範圍包括如下版本。

Discuz! ML v.3.4、Discuz! ML v.3.3、Discuz! ML v.3.2
源碼下載鏈接:https://bitbucket.org/vot/discuz.ml/downloads/

0X2 漏洞分析!

根據公告定位文件source/module/portal/portal_index.php第32行
在這裏插入圖片描述

查看問題函數上方查看定義函數以及關聯文件的位置,可以看到template函數在/source/function/function_core.php中,繼續跟進

在這裏插入圖片描述

問題代碼如下所示。

KaTeX parse error: Expected group after '_' at position 45: …'.DISCUZ_LANG.'_̲'.(defined('STY…templateid.’’.str_replace(’/’, '’, $file).’.tpl.php’;
程序將緩存文件寫在了/data/template/目錄下,文件名由DISCUZ_LANG等多個變量組成,問題就出在這兒了,看看DISCUZ_LANG的值是哪兒獲取來的:

在這裏插入圖片描述

可以看到從程序全部變量$_G[‘config’][‘output’][‘language’]中獲取了該值。繼續跟進看看該值可以定位到/source/class/discuz/discuz_application.php:

在這裏插入圖片描述

在304行,系統通過Cookie獲取了語言的值,並在341行定義了前面要找的DISCUZ_LANG,值爲Cookie中獲取到的lnglng。可以看到整個過程沒有任何的過濾。整個流程即就是:外部參數`lng(即language語言)可控,導致template函數生成的臨時模板文件名可操縱,插入自己的代碼,最終include_once`包含一下最終導致了代碼注入。那這裏可以搜一下其他的可利用點,全局查找:
在這裏插入圖片描述

大約有60多個點可以用的。

0X3 漏洞利用

訪問論壇主頁,在Cookie的language字段值後面拼接php代碼:

‘.phpinfo().’

在這裏插入圖片描述

執行命令獲得管理員權限:

在這裏插入圖片描述
0X4 漏洞修復

在/source/class/discuz/discuz_application.php 第338行之後341行之前加入該代碼暫緩此安全問題:

lng=strreplace("(","",lng = str_replace("(","",lng);lng=strreplace(")","",lng = str_replace(")","",lng);lng=strreplacereplace(","",lng = str_replace_replace('"',"",lng);ln("","",ln("'","",lng);lng=strg=strreplace(,"",lng = strg = str_replace('`',"",lng);

獲取更多漏洞復現知識請關注WX公衆號【安全漏洞環境學習】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章