作者介绍:Ice
国科学院安全学员 , 在国科学习安全课程 , 也参与在国科学生会安全团队中进行安全实战能力的提升 。本次分享主要是针对现在一款运用极广的开发框架Thinkphp的远程代码执行漏洞研究 , 希望给大家带来一些帮助 。
0x00背景
ThinkPHP诞生于2006年 , 是一个国产开源的PHP开发框架 , 其借鉴了Struts框架的Action对象 , 同时也使用面向对象的开发结构和MVC模式 。ThinkPHP可在windows和linux等操作系统运行 , 支持MySQL , Sqlite和PostgreSQL等多种数据库以及PDO扩展 , 是一款跨平台 , 跨版本以及简单易用的PHP框架 。
ThinkPHP是一款运用极广的PHP开发框架 。其5.0.23以前的版本中 , 获取method的方法中没有正确处理方法名 , 导致攻击者可以调用Request类任意方法并构造利用链 , 从而导致远程代码执行漏洞 。
0x01影响范围
Thinkphp 5.0.0~ 5.0.23
0x02漏洞分析
此处漏洞出现在thinkphp用于处理HTTP请求的Request类中 , 其中源码存在一个method方法可以用于获取当前的请求类型 。
Method方法路径:thinkphp/library/think/Request.php
文章插图
IsGET、isPOST、isPUT等方法都调用了method方法来做请求类型的判断(只列出来这些 , 还有其他的 , 比如head请求、patch请求)
文章插图
而在默认情况下 , 是有表单伪装变量的 。
var_method为“表单伪装变量” , 这个东西在Application/config.php里面定义
文章插图
里面出现了:表单请求类型伪装变量 , 我上官方论坛看了一下 , 他是这样定义的
文章插图
因为html里的form表单的method属性只支持get和post两种 , 由于源码没有进行任何过滤的措施 , 我们就可以利用控制_method参数来动态调用类中的任意方法 , 通过控制$_POST的值来向调用的方法传递参数
在默认情况下 , 该变量的值为“_method”
但是我们在method方法中 , 将表单伪装变量对该方法的变量进行覆盖 , 可以实现对该类的所有函数进行调用 。
在request类中 , 分析一下_construct析构方法
文章插图
我们看见 , 如果析构方法中属性不存在(142行) , 那么就会自己调用配置文件中的default_fileter的值(所以在thinkphp5.0.10版本中 , 可以构造这样的一个
【ThinkPHP5 5.0.23 远程代码执行漏洞】payload——》s=ipconfig&_mehthod=__construct$method=&filter[]=system)
但是由于thinkphp5.0.23中进行了更新 , 在APP类中(路径thinkphp/ library/think/App.php)中进行更新 , 新增设置了filter的属性值 , 初始化了filter的属性值 , 所以上个版本的覆盖文件的默认值无法被利用 。
文章插图
而后 , 我们发现在request中的param方法也调用了method方法 , 他用于获取当前请求的参数 , 传入了默认值true
文章插图
这个时候我们在返回去看_method方法
文章插图
当传过来的值为true时 , 会利用到server方法 , 我们再看一下这个方法
文章插图
由上可知 , 我们传过来的参数是REQUEST_METHOD , 即name为REQUEST_METHOD , 而后就会去调用input方法 , 我们跟踪一下input方法
文章插图
我们在跟踪一下getFilter方法看看
文章插图
很明显这个方法执行了图中画框的代码(不为空) , $this->filter被赋值给了$filter , 也就是请求中的filter参数
推荐阅读
- 华为内部远程工具——IPOP,了解一下
- 小米|远程看家神器!一图看懂小米智能家庭屏 10:到手949元
- Windows子系统Ubuntu开启远程连接
- VNC实现Windows远程访问Ubuntu 16.04
- 如何远程维护路由器?
- 黑客大神的Weblogic 远程命令执行漏洞分析
- 外网远程桌面连接设置
- 集串口 SSH远程登录和FTP传输三合一工具MobaXterm
- SSH只能用于远程Linux主机?那说明你见识太小了
- 华为|首发鸿蒙OS!华为智能门锁图赏:配3.97寸大屏 可远程对讲