Phpcollab漏洞分析與利用

漏洞簡介

Phpcollab

Phpcollab是一個開源協作項目管理系統,不同的部門、組織的用戶可通過網路訪問系統對項目以及任務進行發布和管理,從而合作完成一個項目。

漏洞介紹

PhpcollabSQl注入漏洞:在phpcollab 2.5.1以及更早版本中存有SQL注入漏洞,允許遠程惡意訪問者執行任意的SQL命令。漏洞存在於topics/deletetopics.phpproject參數和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,使用adminadmin等錄測試賬戶。返回的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商業智能分析報表「玩」法介紹
有禮有面有據 - 當紀錄片遇到數據可視化
通俗易懂-數據分析學生是怎麼玩天天酷跑的

TAG:漏洞 | SQL注入 | 數據分析 |