1. 程式人生 > >thinkphp遠端程式碼執行漏洞

thinkphp遠端程式碼執行漏洞

0x00前言

近日thinkphp團隊釋出了版本更新https://blog.thinkphp.cn/869075,其中修復了一處getshell漏洞。

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

危害:遠端程式碼執行

0x01漏洞原理

首先我們來看url

http://localhost/public/index.php?s=index/\think\Container/invokeFunction

此處是在沒有使用pathinfo的情況下訪問index應用think\Container控制器的invokeFunction函式

此處之所以沒有使用pathinfo是因為如果使用pathinfo的話控制器就會被自動轉成think然後Container會被視為函式 因為不存在think所以肯定是不行了(think是個名稱空間)

我們先來看下為什麼控制器的名字是think\Container

因為Container這個類不在控制器的目錄下所以沒法直接用Container進行訪問,需要一點特殊的操作

從上圖可以看出Container類的名稱空間是think

我們來看下tp是怎麼載入控制器的

從上圖可以看到這東西是進了controller這個函式 這個函式位於App類

因為think\Container在tp執行的時候就會被載入 所以用think\Container這個字串例項化控制器的時候就會例項化Container這個類 然後我們下一步是去呼叫invokeFunction這個函式。

這個函式有倆引數

第一個引數是函式的名字 第二個引數是一個數組 陣列就是第一個引數中的函式用到的引數比如function傳入aaa然後vars傳入[123,321]就相當於呼叫aaa(123,321)

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

vars[]=函式名&vars[1][]=引數

此處是利用php的陣列注入

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

我們的url就可以這樣寫

http://localhost/public/index.php?s=index/\think\Container/invokeFunction&function=call_user_func_array&vars[]=system&vars[1][]=whoami

然後就可以看到執行結果

從上圖可以看到的確執行了system(‘whoami’)