https://help.aliyun.com/noticelist/articleid/1000081331.html?spm=5176.2020520001.1004.7.2e874bd363uLuf
先贴个漏洞预警,这里做一些内容摘要:
漏洞描述
由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。
影响版本
ThinkPHP 5.0系列 < 5.0.23
ThinkPHP 5.1系列 < 5.1.31
漏洞分析
我们从补丁上来对漏洞做一定的分析
5.0.x
再放一个5.0.20源码
下面使补丁中修改的内容
于是我们从 $ controller开始分析
补丁对$ controller的名称做了过滤,接着往下看代码:
这里对controller实例化,到Loader里看看:
public static function controller($name, $layer = 'controller', $appendSuffix = false, $empty = '')
{
list($module, $class) = self::getModuleAndClass($name, $layer, $appendSuffix);
if (class_exists($class)) {
return App::invokeClass($class);
}
if ($empty) {
$emptyClass = self::parseClass($module, $layer, $empty, $appendSuffix);
if (class_exists($emptyClass)) {
return new $emptyClass(Request::instance());
}
}
大体意思就是如果这个类name存在就实例化,接着跟进getModuleAndClass:
protected static function getModuleAndClass($name, $layer, $appendSuffix)
{
if (false !== strpos($name, '\\')) {
$module = Request