近期,esafe白帽駭客安全研究院監測到互聯網上出現了Discuz!ML V3.X的代碼注入漏洞。Discuz!ML是一款基於Discuz!X的多語種,全功能,且開源的互聯網內容管理平臺,能用於搭建論壇、博客、門戶網站等一系列具有社交功能的互動網站並自行定制專用功能和組件。預設支援16種語言,並可繼續添加其他語言。官方論壇為:http://codersclub.org/discuzx/。沒找到和discuz官方的聯繫。
概況
由於Discuz!ML是基於Discuz!X開發而成,故全球統計資料以Discuz為目標。目前FOFA系統最新資料(一年內資料)顯示全球範圍內共有115762個基於Discuz的網站。中國使用數量最多,共有51453個,美國第二,共有41177個,中國香港第三,共有12392個,南非第四,共有1990個,中國臺灣第五,共有972個。需要注意的是,由於這是開源專案,自行定制的網站很可能並不能及時發現。全球範圍內Discuz網站分佈情況如下(僅為分佈情況,非漏洞影響情況)
中國大陸地區北京市使用用數量最多,共有12356個,浙江省第二,共有6706台,江蘇省第三,共有1901個,廣東省第四,共有1854個,河南省第五,共有1458個。
中國大陸範圍內Discuz網站分佈情況如下(僅為分佈情況,非漏洞影響情況)
漏洞原理
payload如下:首先打開portal.php,看到裡面包含了class_core.php這個檔。
查看class_core.php檔,這裡調用了creatapp()方法,而在creatapp()方法中又調用了discuz_application的instance()方法。
在instance()方法中產生實體了discuz_application這個類。
查看discuz_application的構造函數,調用了_init_input()方法,來格式化GPC等變數。
查看"source/class/discuz/discuz_application.php"檔_init_input()方法。在251-253行,304-305行,341行。這裡對使用者的cookie進行遍歷,去除首碼後賦值給了$var,將含有language的cookie值賦值給$lng,最後賦值給DISCUZ_LANG。當我們傳入liTq_2132_language=en'.phpinfo().';的時候,DISCUZ_LANG的值為en'.phpinfo().'。
之後進入portal_index.php檔,這裡調用了template()方法。
找到function_core.php檔中的template()方法,最關鍵的一步,直接將前面的DISCUZ_LANG拼接賦值給了$cachefifle變數。$cachefile的值為en'.phpinfo().'。
之後將$cachefile作為checktplrefresh()方法的參數,更新緩存。
跟進checktplrefresh()方法,這裡又將$cachefile作為parse_template()方法的參數傳了進去。
查看parse_template()方法,在第74行將$cachefile拼接後賦值給了$headeradd,$cachefile的值為en'.phpinfo().' ,這時候閉合了單引號,然後賦值給了$template,最後寫入快取檔案。
我們查看快取檔案en'.phpinfo().'_1_1_common_header_portal_index.tpl.php。傳入en'.phpinfo().' 閉合了單引號,寫入了phpinfo(),後面包含這個檔,導致執行惡意程式碼。
該漏洞的觸發點較多,不止portal.php。
漏洞影響
Discuz!ML v.3.x
CVE編號
##
暫無
POC
目前
FOFA
用戶端平臺已經更新針對該漏洞的檢測
POC
。