thinkphp高危漏洞修复--因控制器任意实例化产生的注入漏洞

栏目: PHP · 发布时间: 7年前

内容简介:漏洞原因:tp在没有配置路由的情况下的访问方式如下

官方说明

漏洞阐述

漏洞原因:

tp在没有配置路由的情况下的访问方式如下

module/controller/action

当controller设置为tp内的app类时,即\think\app时,可以执行\think\app内的任一方法,而在\think\app类中存在

invokeFunction方法,可以用字符串形式传入参数,并将字符串转化为函数执行,从而产生写入漏洞。

攻击者可以利用这个漏洞,写入.php后缀的后门入口文件。

官方建议的修复方式:

github-commit

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

官方的修复原理:http请求的controller名称中如果有斜线则报错,即在没有斜线的情况下,会拼接应用命名控制,这样就防止了直接访问think\app类。

但是如果在应用内或其它地方使用了Loader::controller()方法,以参数方式传入完整类名,依然可以实现实例化任意类。

有别于官方的修复方法

修改Loader类中的controller方法

if (false !== strpos($name, '\\')) {
    $class  = $name;
    $module = Request::instance()->module();
} else {
    if (strpos($name, '/')) {
        list($module, $name) = explode('/', $name);
    } else {
        $module = Request::instance()->module();
    }
    $class = self::parseClass($module, $layer, $name, $appendSuffix);
 }

改为

if (strpos($name, '/')) {
     list($module, $name) = explode('/', $name);
} else {
     $module = Request::instance()->module();
}
$class = self::parseClass($module, $layer, $name, $appendSuffix);

修改原理:

修改后,http的调用只能使用app内的controller,即命名空间限定在app中

这样改的缺点是Loader类的controller方法只能实例化当前应用内的控制器类,限定了类的命名空间。

修改示例

github-commit

不修改内核的改动思路

老版本不想更新内核的话,可以监听app_begin行为,判断请求的controller名称中没有斜线就行了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning JavaScript

Learning JavaScript

Shelley Powers / Oreilly & Associates Inc / 2006-10-17 / $29.99

As web browsers have become more capable and standards compliant, JavaScript has grown in prominence. JavaScript lets designers add sparkle and life to web pages, while more complex JavaScript has led......一起来看看 《Learning JavaScript》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试