内容简介:漏洞原因:tp在没有配置路由的情况下的访问方式如下
漏洞阐述
漏洞原因:
tp在没有配置路由的情况下的访问方式如下
module/controller/action
当controller设置为tp内的app类时,即\think\app时,可以执行\think\app内的任一方法,而在\think\app类中存在
invokeFunction方法,可以用字符串形式传入参数,并将字符串转化为函数执行,从而产生写入漏洞。
攻击者可以利用这个漏洞,写入.php后缀的后门入口文件。
官方建议的修复方式:
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方法只能实例化当前应用内的控制器类,限定了类的命名空间。
修改示例
不修改内核的改动思路
老版本不想更新内核的话,可以监听app_begin行为,判断请求的controller名称中没有斜线就行了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Thinkphp5 控制器名过滤不严导致getshell漏洞分析
- iOS之导航返回上上个控制器或指定返回某个控制器
- iOS小技巧·把子视图控制器的视图添加到父视图控制器
- javascript – AngularJS控制器错误 – :$http.get不是控制器部分的函数
- AC敏捷控制器及准入控制技术对比
- angularjs – 使用ui-router时,控制器是否可以从父控制器继承范围
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
社群营销与运营/互联网+新媒体营销规划丛书
秦阳//秋叶|总主编:秋叶 / 人民邮电出版社 / 2017-5 / 45.00元
《社群营销与运营》共分6章。第1章重点介绍了社群营销的起因、概念、构成、价值和评估模型,引导读者全面认识社群以及社群营销;第2章介绍了如何从无到有、从小到大建设一个社群的手法和注意事项;第3章重点介绍维持社群活跃度的各种技巧;第4章介绍了组织一场社群线下活动五个阶段的执行方案;第5章介绍了如何从无到有、由弱到强地构建社群运营团队;第6章介绍如何正确看待社群商业变现以及社群商业变现的三大模式和四个基......一起来看看 《社群营销与运营/互联网+新媒体营销规划丛书》 这本书的介绍吧!