ThinkPHP 5.1.x~5.2.x全版本 RCE 漏洞分析

大概看了下,这个洞跟5.0的原理大致相同,都是利用Reuqest类的Method方法覆盖了 $this->filter属性,然后进入 filterValue调用 call_user_func($filter,$value)$value当前请求参数和URL地址中的参数合并,从而导致RCE。

漏洞验证

测试版本:Thinkphp_5.1.1 补丁:https://github.com/top-think/framework/commit/2454cebcdb6c12b352ac0acd4a4e6b25b31982e6 需要在入口文件处关闭报错。

payload

c=exec&f=calc.exe&&_method=filter&

流程分析

在获取应用调度信息时会调用Request类的method方法获取当前的请求类型

$this->config->get('var_method')外部可控,即 $this->method我们可控,从而我们可以通过 $this->{$this->method}($_POST)调用任意方法。

跟进 filter方法,发现我们post的数据可以覆盖 $this->filter属性。

回到App类,由于我们开启了 $this->debug从而可以进入 Request类的 param方法。

跟进 param方法, $this->param当前请求参数和URL地址中的参数合并。然后进入 input方法。

跟进 input方法,因为 $data为上面提到的 $this->param即数组,从而进入if条件执行 array_walk_recursive($data,[$this,'filterValue'],$filter);

查阅 array_walk_recursive函数可知,该函数会调用 $this->filterValue函数,把 $data数组的每个值作为其第一个参数,键名作为第二个参数,并且把 $this->filter作为第三个参数。

继续跟进 filterValue方法,发现调用了 call_user_func($filter,$value)$filter为刚开始我们覆盖的 $this->filter属性的遍历键值,等于 $_POST数组。 $value当前请求参数和URL地址中的参数合并数组 $this->param的键值。

当遍历到 $this->param的第二个键值 calc.exe$filters的第一个键值 exec时,成功执行命令,弹出了计算器。

补丁分析

与5.0一样,对表单请求类型伪装变量添加了白名单。

本文分享自微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP修行之路

php注册、登录界面的制作

当初我觉得一个网站上注册和登录这两个功能很神奇,后来自己研究一下发现其实道理很简单,接下来看一下怎么实现的吧。。。。

60930
来自专栏前端自习课

【React】345- React v16.9 新特性[译]

今天我们发布了 React 16.9。它包含了一些新特性、bug修复以及新的弃用警告,以便与筹备接下来的主要版本。

43040
来自专栏学无止境

Python爬虫实例:爬取豆瓣Top250

入门第一个爬虫一般都是爬这个,实在是太简单。用了 requests 和 bs4 库。

13730
来自专栏菩提树下的杨过

asmx迷10分钟升级成wcf熟手指南

前言:本文旨在帮助从未接触过wcf(.svc文件)的webservice开发人员,快速将传统的webService/asmx技术迁移到wcf。高手就不用浪费时间...

9120
来自专栏PHP修行之路

修改phpcms中的评论样式

phpcms中自带的评论插件很好用!但是样式个人感觉丑的狠,百度一下也没能找到解决方式,也许是自己的搜索方式不对,于是自己就研究了研究,这里可以使用两种方法进行...

12010
来自专栏PHP修行之路

【swoole】使用swoole简单实现TCP服务

上一篇写到了如何在windows系统上面利用docker快速搭建swoole开发环境,接下来体验下swoole的使用

6920
来自专栏PHP修行之路

【swoole】如果使用好定时器功能

开始使用定时器的时候我放到了 onWorkStart 中执行,这样做的话可以保证在单个worker进程的情况下定时器可以正常运行,但是对于swoole来说让它单...

6720
来自专栏菩提树下的杨过

开源流媒体服务器SRS学习笔记(3) - HTTPCallback实现安全认证

按上回继续,安全论证是绝大多数应用的基本要求,如果任何人都能无限制的发布/播放视频,显然不适合。SRS中可以通过HTTPCallback机制来实现,参考下面的配...

23030
来自专栏PHP修行之路

使用curl制作简易百度搜索

但是我发现使用https协议后不能够获得百度上的数据于是改为http://www.baidu.com?wd=搜索的关键字就可以啦!!

11620
来自专栏PHP修行之路

如何将workerman部署到windows服务器上面

一直以来对php的即时通讯都很好奇,其实是不知道应该怎么来实现,后来了解到了swoole和workerman这两个神器,他们都可以实现即时通信的功能,其中swo...

14020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励