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

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

内容简介:漏洞原因: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名称中没有斜线就行了。


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

查看所有标签

猜你喜欢:

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

如何构建敏捷项目管理团队

如何构建敏捷项目管理团队

丽萨·阿金斯 / 徐蓓蓓、白云峰、刘江华 / 电子工业出版社 / 2012-6 / 49.00元

《敏捷项目管理系列丛书•PMI-ACPSM考试指定教材•如何构建敏捷项目管理团队:ScrumMaster、敏捷教练与项目经理的实用指南》结合作者的亲身经历告诉读者如何建立一个高性能的敏捷项目管理团队,以及最终成为一名优秀的敏捷教练。作者将敏捷教练定义为导师、协助者、老师、问题解决者、冲突领航员、协作指挥者,正是这种不同角色之间的细微区别才使敏捷教练的工作富有深度。《敏捷项目管理系列丛书•PMI-A......一起来看看 《如何构建敏捷项目管理团队》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具