漏洞介紹
ATutor是ATutor團隊的一套開源的基於Web的學習內容管理系統(LCMS)。該系統包括教學內容管理、論壇、聊天室等模塊。Atutor與Claroline、 Moddle及Sakai號稱為四大開源課程管理系統。
ATutor2.2.4語言導入功能處存在一處安全漏洞(CVE-2019-12169)。攻擊者可利用該漏洞進行遠程代碼執行攻擊。
經過分析發現,除了CVE-2019-1216所報道的語言導入功能外,ATutor在其他功能模塊中也大量存在着相似的漏洞,本文會在后面針對這一點進行介紹。
漏洞分析
據漏洞披露可知,漏洞觸發點存在於mods/_core/languages/language_import.php文件中
首先跟入language_import.php文件
從language_import.php文件中35行起,可以發現關於文件上傳相關代碼
從上圖紅框中代碼可知,此處代碼塊是對文件上傳情況進行校驗
在文件成功上傳后,進入下一個if分支
在這個分支里,程序將調用\$languageManager->import方法對文件進行處理
繼續跟入import方法
在import方法中,首先確認了用來保存上傳文件的路徑\$import_path
接着調用PclZip對壓縮包進行處理。
為了更好的理解程序執行流程,我們動態調試一下
首先我們構造一個poc.php
將這個poc.php打包為poc.zip
訪問如下鏈接以進入上傳頁面
http://target/ATutor/mods/_core/languages/language_import.php
在上傳語言包頁面中選擇構造好的poc.zip並點擊import按鈕上傳
請求發送給后台服務器,程序執行進入斷點
此時的\$import_path值為atutor應用的/content/import路徑:”content/import/”
程序調用PclZip的extract方法對壓縮包進行解壓
PclZip是一個強大的壓縮與解壓縮zip文件的PHP類,PclZip
library不僅能夠壓縮與解壓縮Zip格式的文件;還能解壓縮文檔中的內容,同時也可以對現有的ZIP包進行添加或刪除文件。
我們再來看下import方法中是如何使用PclZip的
程序創建了上傳的zip壓縮包的一個PclZip對象進行操作與控制,在解壓過程中使用了extract方法。該方法中第一個參數是設置項,第二個是對應設置項的值
我們來看下PCLZIP_OPT_PATH設置項的作用
可見,PCLZIP_OPT_PATH設置項指定我們上傳的zip文件解壓目錄為\$import_path參數對應的路徑
解壓成功后,poc.zip中內容出現在對應文件夾中
查看poc.php中的值,可以發現poc上傳成功
訪問如下地址,觸發poc
除此之外,該應用幾乎所有import接口,在后台都采用PclZip將上傳的zip解壓到對應目錄中。然而這些操作無一例外的未對壓縮包中的文件進行校驗
下面舉幾個例子:
位於mods/_core/themes/import.php文件中的主題導入功能
代碼如下:
可以發現,這里也使用了extract方法將上傳文件進行解壓
來看一下導入主題功能對應的前端頁面
這里頁面與導入語音包的頁面極其相似,只不過最終解壓后存放的路徑不同,不再是content/import/,而是themes/
在此處上傳構造好的poc.zip,最終poc.php將會被解壓到themes文件夾中
位於/mods/_standard/tests/question_import.php文件的問題導入功能
位於mods/_standard/patcher/index_admin.php文件的補丁導入功能
這些功能無一例外的存在着相似的漏洞
總結
針對單一文件上傳,大多數Web應用都會進行嚴格的文件類型檢測,但是涉及到壓縮包上傳,很多應用都不會檢測壓縮包中的內容,直接將壓縮包中內容解壓到對應目錄中,這樣就會導致了這類漏洞的產生。