ThinkPHP5,未开启强制路由导致远程执行代码漏洞

漏洞表现

?s=\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=100

修复方案

1、开启强制路由
config/app.php

// 是否强制使用路由
'url_route_must' => true,
// 是否开启路由
'url_route_on'   => true,

2、修改默认参数名称

// PATHINFO变量名 用于兼容模式
'var_pathinfo' => 'ST',

3、修改源码打补丁
thinkphp/library/think/route/dispatch/Module.php
line:70
$this->controller = $convert ? strtolower($controller) : $controller;
向下增加:

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
    throw new HttpException(404, 'controller not exists:' . $controller);
}