ThinkPHP再爆高危漏洞 啟明星辰提供解決方案
發布時間 2019-01-132019年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應用安全網關報警截圖:
