Discuz!X ≤3.4 任意檔案刪除漏洞分析
作者:LoRexxar'@知道創宇404實驗室
發表時間:2017年9月30日
0x01 簡述
Discuz!X社群軟體,是一個採用 PHP 和 MySQL 等其他多種資料庫構建的效能優異、功能全面、安全穩定的社群論壇平臺。
2017年9月29日,Discuz!修復了一個安全問題用於加強安全性,這個漏洞會導致前臺使用者可以導致任意刪除檔案漏洞。
2017年9月29日,知道創宇404 實驗室開始應急,經過知道創宇404實驗室分析確認,該漏洞於2014年6月被提交到 Wooyun漏洞平臺,Seebug漏洞平臺收錄了該漏洞,漏洞編號 ssvid-93588。該漏洞通過配置屬性值,導致任意檔案刪除。
經過分析確認,原有的利用方式已經被修復,添加了對屬性的 formtype 判斷,但修復方式不完全導致可以繞過,通過模擬檔案上傳可以進入其他 unlink 條件,實現任意檔案刪除漏洞。
0x02 復現
登陸DZ前臺賬戶並在當前目錄下新建 test.txt 用於測試
請求
home.php?mod=spacecp&ac=profile&op=base
POST birthprovince=../../../test.txt&profilesubmit=1&formhash=b644603b
其中formhash為使用者hash
修改成功之後出生地就會變為../../../test.txt
構造請求向home.php?mod=spacecp&ac=profile&op=base
上傳檔案(普通圖片即可)
請求後文件被刪除
0x03 漏洞分析
Discuz!X 的碼雲已經更新修復了該漏洞
https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574
核心問題在upload/source/include/spacecp/spacecp_profile.php
跟入程式碼70行
if(submitcheck('profilesubmit')) {
當提交 profilesubmit 時進入判斷,跟入177行
我們發現如果滿足配置檔案中某個 formtype 的型別為 file,我們就可以進入判斷邏輯,這裡我們嘗試把配置輸出出來看看
我們發現formtype欄位和條件不符,這裡程式碼的邏輯已經走不進去了
我們接著看這次修復的改動,可以發現228行再次引入語句 unlink
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
回溯進入條件
當上傳檔案並上傳成功,即可進入 unlink 語句
然後回溯變數$space[$key]
,不難發現這就是使用者的個人設定。
只要找到一個可以控制的變數即可,這裡選擇了 birthprovince。
在設定頁面直接提交就可以繞過欄位內容的限制了。
成功實現了任意檔案刪除
0x04 說在最後
在更新了程式碼改動之後,通過跟蹤漏洞點邏輯,我們逐漸發現,該漏洞點在 2014 年被白帽子提交到 Wooyun平臺上,漏洞編號wooyun-2014-065513。
由於DZ的舊版程式碼更新流程不完整,已經沒辦法找到對應的補丁了,回溯到 2013 年的 DZ3 版本中,我們發現了舊的漏洞程式碼
在白帽子提出漏洞,可以通過設定個人設定來控制本來不可控制的變數,並提出了其中一種利用方式。
廠商僅對於白帽子的攻擊 poc 進行了相應的修復,導致幾年後漏洞再次爆出,dz 才徹底刪除了這部分程式碼...
期間廠商對於安全問題的解決態度值得反思...
0x05 Reference
- 1 Discuz!官網 http://www.discuz.net
- 2 Discuz!更新補丁undefined https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574
- 3 Seebug漏洞平臺收錄地址 https://www.seebug.org/vuldb/ssvid-93588