在初始化路由检查配置之后,就进行Route::check,由以上代码看出,若路由寻不到对应操作,即返回$result=false,且开启了强制路由$must的情况下,就会抛出异常,并最终进入Route::parseUrl函数,进行$path解析,以上就进入了我们的漏洞触发点:
首先,在该函数中进行url解析,然后,进入到parseUrlPath函数,根据/进行路由地址切割,通过数组返回:
最终在parseUrl函数中,将返回的$path提取出路由,即module、controller、action,然后封装到$route后返回:
回到thinkphp/library/think/App.php文件的run()函数:
在完成RouteCheck后,进入到exec()函数中去:
在该函数中,首先路由信息首先进入module()函数进行检验,该函数首先查看该路由中的模块信息是否存在且是否存在于禁止的模块类表中:
模块存在的话,继续往下跟踪,分别将模块中的controller、actionName经过处理后赋值到$instance、$action,最终$instance、$action被赋值给了$call参数。
最终$call参数进入了self::invokeMethod()进行处理:
在函数中,通过反射ReflectionMethod获取controller(method[0])和action(method[1])对象下的方法,然后通过$args = self::bindParams($reflect, $vars);获取到传入参数。以上即为漏洞调用链。
我们根据Payload来进行最终攻击链的总结:
siteserver/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
根据上面的分析,我们将路由解析为:
module:index
controller:think\app
action:invokefunction
通过上述的利用链,最终通过反射ReflectionMethod进入到Think/app文件中的invokefunction方法中:
通过构造参数,最终即可执行任意代码。
4.3、ThinkPHP 5.x 远程代码执行漏洞24.3.1、漏洞概要
漏洞名称:ThinkPHP 5.0.x-5.1.x远程代码执行漏洞
参考编号:无
威胁等级:严重
影响范围:ThinkPHP v5.0.x < 5.0.23,ThinkPHP v5.1.x < 5.0.31
漏洞类型:远程代码执行漏洞
利用难度:容易
4.3.2、漏洞描述
2019年1月11日,某安全团队公布了一篇ThinkPHP 5.0.远程代码执行漏洞文档,公布了一个ThinkPHP 5.0.远程代码执行漏洞。文章中的该漏洞与2018年12月的ThinkPHP 5.0.*远程代码执行漏洞原理相似,攻击者可利用该漏洞在一定条件下获取目标服务器的最高权限。后经研究,在一定条件下,ThinkPHP 5.1.x版本也存在该漏洞,在满足条件的情况下,攻击者可利用该漏洞执行任意代码。
4.3.3、漏洞分析
该漏洞的漏洞关键点存在于thinkphp/library/think/Request.php文件中:
从代码中可知: