内容简介:漏洞原因: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时,控制器是否可以从父控制器继承范围
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!