Phpcollab漏洞分析與利用
漏洞簡介
Phpcollab
Phpcollab是一個開源協作項目管理系統,不同的部門、組織的用戶可通過網路訪問系統對項目以及任務進行發布和管理,從而合作完成一個項目。
漏洞介紹
Phpcollab
SQl注入漏洞:在phpcollab 2.5.1以及更早版本中存有SQL注入漏洞,允許遠程惡意訪問者執行任意的SQL命令。漏洞存在於topics/deletetopics.php
中project
參數和id
參數,bookmarks/deletebookmarks.php
中的id
參數。漏洞CVE編號為(CVE-2017-6089)。
Phpcollab
文件上傳漏洞:文件clients/editclient.php存在任意文件上傳漏洞,允許已認證的用戶上傳一個可被Web伺服器解析執行的文件,通過訪問logos_clients目錄下對應的文件,執行命令,漏洞CVE編號為(CVE-2017-6090)。
影響版本
版本號 <= 2.5.1
實驗內容
步驟1: project
參數注入分析
首先,打開桌面的Seay源代碼審計系統,新建項目,選擇本次審計的代碼路徑(C:phpStudywwwphpcollab),確定。系統會自動列出所選目錄下的文件結構。我們找到本次漏洞的源碼文件 topics/deletetopics.php
,點擊打開源碼界面。
在函數列表中選擇$project,右側的代碼會自動跳轉到包含該函數的代碼處
我們查看代碼27~34行,代碼如下:
if($_GET[project]){$project = $_GET[project];} else { unset($project);}$tmpquery = "WHERE pro.id = $project";$projectDetail = new request();$projectDetail->openProjects($tmpquery);
$_GET
從URL中獲取變數project的值,unset
表示若無該變數值則不設置,tmpquery
將變數帶入資料庫查詢,在代碼執行查詢過程中,並未對變數做安全處理
步驟2: project
參數注入驗證
首先使用瀏覽器訪問http://file.ichunqiu.com/awed3579/
打開本次實驗的POC,內容如下:
隨後開始訪問目標網站http://test.ichunqiu.com/phpcollab/topics/deletetopics.php
,使用admin
、admin
等錄測試賬戶。返回的url中會存有一段PHPSESSID值(每次登陸值可能不一樣),記住該值,我們點擊 我的討論--》話題--》刪除,成功訪問漏洞頁面。
在project=1
後加上訪問,簡單判斷SQL注入
使用POC中的第一條語句,結合本次實驗的PHPSESSION,組成新的POC鏈接並訪問.
針對參數project的注入語句如下:
(SELECT+SLEEP(5)+FROM+members+where+login+like+0x61646d696e)
這條語句從members列中查詢0x61646d696e(admin的16進位)用戶的登陸,查詢成功後資料庫sleep 5秒
網站執行的結果從上圖可以看出,確實載入了幾秒鐘。
為了驗證確實是資料庫執行了語句導致的載入,我們可以直接在資料庫中執行上述語句做對比。
打開桌面上的phpstudy,點擊Mysql管理器,選擇Mysql-Front,登陸localhost,找到phpcollb表,使用SQL編輯器執行上述語句(注意資料庫不支持+,所以需去除+號執行),右擊執行。
可以看見語句起作用後,效果與網頁載入類似,漏洞驗證成功
步驟3: id
參數注入分析
我們回到Seay源代碼審計系統,找到本次漏洞的源碼文件 topics/deletetopics.php
,點擊打開源碼界面,
在函數列表中選擇$id
,右側的代碼會自動跳轉到包含該函數的代碼處。
源代碼9~18行對應了id參數的漏洞點
if ($action == "delete") {$id = str_replace("**",",",$id); //$tmpquery1 = "DELETE FROM ".$tableCollab["topics"]." WHERE id IN($id)";$tmpquery1 = "DELETE FROM ".$tableCollab["topics"]." WHERE id = $id"; //$tmpquery2 = "DELETE FROM ".$tableCollab["posts"]." WHERE topic IN($id)";$tmpquery2 = "DELETE FROM ".$tableCollab["posts"]." WHERE topic = $id";$pieces = explode(",",$id);$num = count($pieces); connectSql("$tmpquery1"); connectSql("$tmpquery2");
str_replace
函數將參數中的**
替換為,
,tmpquery1
拼接字元串組成查詢語句,connectSql
執行SQL語句,這段代碼在判定執行delete操作之後,首先對id參數中出現的星號替換為逗號,隨後將字元串組合形成查詢語句,最後通過connectSql
函數執行兩個SQL語句,在代碼執行過程中,並沒有對變數id做任何安全處理。
步驟4:id
參數注入驗證
我們繼續使用審計系統,本次驗證選擇一個不同的php頁面去驗證,在deletetopics.php源碼頁面中,選中$id = str_replace("**",",",$id);
這一段代碼,右擊選擇全局搜索,即可發現其他文件中包含一樣的代碼的文件。
我們選擇deletebookmarks.php,可以看見導致漏洞的代碼原理一樣
我們使用POC中的第二條語句,結合實驗的url和PHPSESSIONS,得到本次實驗的POC(溫馨提示:構造poc時,可以使用hackbar的split URL將不同參數分隔開來),訪問後查看運行結果如下:
驗證成功!
其實通過源代碼審計系統的全局搜索看,還存在很多類似的代碼,不再一一驗證
步驟5:文件上傳漏洞分析
這個漏洞點存在於/phpcollab/clients/editclient.php文件的第63~70行,使用上述打開漏洞頁面代碼同樣的步驟,打開該文件,漏洞代碼如下:
- strtolower() 函數把字元串轉換為小寫
- substr() 函數返回字元串的一部分
- strrchr() 函數查找字元在指定字元串中從左面開始的最後一次出現的位置
這裡代碼通過對文件名的字元串操作,取得了小寫的後綴名。值得注意的是,move_uploaded_file 完成上傳動作後,新文件的名稱為../logos_clients/".$id.".$extension
,也就是保存到logos_clients文件夾下,文件名為$id對應的值,並且後綴名不變。這塊是上傳logo的位置,並對制後綴名未做限制,所以導致漏洞的出現。
步驟6:文件上傳漏洞驗證
我們訪問目標地址http://test.ichunqiu.com/phpcollab/
(可能需要登錄),點擊"客戶「,選擇下面的加號,添加新的客戶組織。
填寫相關信息後,在"標誌"處點擊瀏覽,選擇一個構建好的phpinfo文件(C:phpstudywwwphpinfo.php
),確定保存。這個時候我們可以訪問以下logos_clients/phpinfo.php
頁面,查看是否成功
可以看見並沒有文件,頁面返回404,不存在。這可以證明文件上傳漏洞並不是在第一次新增客戶時觸發的。
這裡我們回到客戶組織頁面,點擊編輯圖標,編輯我們剛剛新建的"客戶"
請注意此處的URL,顯示id=3(可能id值不一樣,這個不影響),結合上述分析的文件名為$id的值可以推算出我們上傳的文件最終名稱為3.php或3.其他後綴。
重新上傳一次我們的phpinfo.php文件再保存,之後就能訪問到logos_clients目錄下的3.php文件了
驗證成功! 當然我們也可以上傳其他的文件,比如一句話webshell等,此處只做漏洞驗證,不再演示。
修復方案
- (1)首先應急方案停止繼續使用該系統,防止造成額外損失,或者將系統收入內網,隔離外部訪問
- (2)在代碼針對源代碼中的輸入變數進行安全排查加固,修改源代碼
- (3)等待官方發布新版本
- (4)使用其他代替系統
思考
請嘗試使用工具繼續分享phpcollab中是否存在其他漏洞
進入實驗環境訪問如下地址:
PhpCollab 2.5.1漏洞分析與利用
推薦閱讀:
※如何快速入門數據分析
※Python進行電影數據分析及可視化
※在業務分析中實現商業洞察 – Excel商業智能分析報表「玩」法介紹
※有禮有面有據 - 當紀錄片遇到數據可視化
※通俗易懂-數據分析學生是怎麼玩天天酷跑的