一 、前言
ThinkPHP是為了簡化企業級應用開發和敏捷WEB應用開發而誕生的輕量級PHP開發框架,具有免費開源、快速、簡單且面向對象等特點。
在ThinkPHP的5.*版本中存在安全隱患,由於ThinkPHP5框架對控制器名沒有進行足夠的安全檢測,導致在沒有開啟強制路由的情況下,可能出現getshell漏洞。受影響的版本包括5.0和5.1。
本期安仔課堂,ISEC實驗室的黃老師將為大家介紹ThinkPHP5的相關知識點,歡迎感興趣的朋友一起交流學習。
二、漏洞分析
該漏洞源於ThinkPHP5框架底層對控制器名過濾不嚴,允許黑客通過url調用Thinkphp框架內部的敏感函數,出現getshell漏洞。具體代碼實現如下:
2.1
thinkphp/library/think/App.php
首先看到routecheck代碼,由於沒有在配置文件上定義任何路由,所以默認按照圖一的方式進行解析調度。如果開啟強制路由模式,會直接拋出錯誤,這時通過Route::import命令加載路由,繼續跟進路由。
2.2
thinkphp/library/think/Route.php
可以看到tp5在解析URL的時候只是將URL按分割符分割,並沒有進行安全檢測。繼續分析:
其中,滲透測試人員最為關心的是
Exchange對外提供的訪問接口,以及使用的加密驗證類型。2.3
thinkphp/library/think/App.php
可以看到:由於程序並未對控制器進行有效的安全過濾和檢查,因此測試人員可以通過引用“\\”來調用任意方法。
2.4
跟進到module方法
在測試時注意使用一個已存在的module,否則會拋出異常,無法繼續運行。此處直接從之前的解析結果中獲取控制器名稱以及操作名,無任何安全檢查。
2.5
跟進到實例化Loader 控制器方法
可以看到如果控制器名中有“\\”,就直接返回。回到“thinkphp/library/think/App.php”的module方法,正常情況下應該獲取到對應控制器類的實例化對象,而我們現在得到了一個“\\think\\App”的實例化對象,通過url調用其任意的public方法,同時解析url中的額外參數,當作方法的參數傳入。我們可以調用invokeFunction這個方法,構造payload為:
三、漏洞利用
所有基於tp5.0框架建設的網站都受此漏洞的影響。
3.1
測試該漏洞點是否被修復
網址後面直接拼接以上代碼,執行之後發現出現phpinfo頁面,說明漏洞存在。
3.2
在public目錄下創建insfo.php
修改漏洞利用代碼,直接在public目錄下創建一個名為insfo.php的一句話木馬。
3.3
刪除insfo.php文件
四、解決方案
直接添加補丁,升級ThinkPHP版本,開啟強制路由,在ThinkPHP5.0版本的thinkphp/library/think/App.php , Module類的獲取控制名處添加如下代碼,正則過濾:
閱讀更多 安勝ANSCEN 的文章