ThinkPHP再爆高危漏洞 啟明星辰提供解決方案

發布時間 2019-01-13
ThinkPHP是一個快速、兼容而且簡單的輕量級國產PHP開發框架,誕生于2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,遵循Apache2開源協議發布,使用面向對象的開發結構和MVC模式,融合了Struts的思想和TagLib(標簽庫)、RoR的ORM映射和ActiveRecord模式,該框架國內應用非常廣泛。

2019年1月11日官方修復了一處嚴重的漏洞,該漏洞可導致遠程命令代碼執行。

 漏洞影響版本:

5.0.x-5.0.23

 漏洞分析:

漏洞主要出現在ThinkPHPRequest類的method方法中,(thinkphp/library/think/Request.php)

Request類可以實現對HTTP請求的一些設置,其中成員方法method用來獲取當前請求類型,其定義如下:


thinkphp支持配置“表單偽裝變量”,默認情況下該變量值為_method,可以通過“表單偽裝變量”進行變量覆蓋實現對該類任意函數的調用,并且$_POST作為函數的參數傳入。


Requset構造函數如下:


因此可以通過構造函數實現對Request類屬性進行覆蓋,如filter屬性。構造如下payload實現遠程代碼執行:

 
遠程代碼最終是在filterValue中的call_user_func()執行:


在官網下載的5.0.23完整版中,在App類(thinkphp/library/think/App.php)中module方法增加了設置filter參數值的代碼,用于初始化filter。因此通過上述請求設置的filter參數值會被重新覆蓋為空導致無法利用。

在5.0.23 Request類中有個param成員函數用于獲取當前請求的參數,也有個method函數:


當傳入數值為true時:


跟進到server方法,參數$name為REQUEST_METHOD


$data為上一步的REQUEST_METHOD:


要想觸發調用param(),只要開啟了debug模式即可:


故構造payload如下:


前面分析可知,我們需要觸發Request類中的param函數來完成filter的覆蓋,在App類中exec()方法中當$dispatch[‘type’]為controller 和method時有直接的調用:


而url中s的值完成設置不同的$method,最終讓routeCheck返回我們需要的$dispath即可。例如構造如下payload,無需debug模式開啟也可實現遠程代碼執行:


 解決方案:

一、官方建議:

    受影響的用戶可將5.0.x升級到5.0.24,官方現已推出補丁,建議開發者進行修復:
 



二、產品檢測與防護:

已部署啟明星辰IDS、IPS、WAF產品的客戶請確認如下事件規則已經下發并應用,即可有效檢測或阻斷攻擊:HTTP_ThinkPHP5.0全版本遠程代碼執行漏洞

(1)天闐入侵檢測與管理系統報警截圖:


(2)天清入侵防御系統報警截圖:


(3)天清Web應用安全網關報警截圖: