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就可以這樣寫
然後就可以看到執行結果
從上圖可以看到的確執行了system(‘whoami’)