首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ThinkPHP 5.1.x~5.2.x全版本 RCE 漏洞分析

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

作者头像
安恒网络空间安全讲武堂
发布2019-09-27 19:37:17
发布2019-09-27 19:37:17
3.7K00
代码可运行
举报
运行总次数:0
代码可运行

大概看了下,这个洞跟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

代码语言:javascript
代码运行次数:0
运行
复制
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一样,对表单请求类型伪装变量添加了白名单。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞验证
  • 流程分析
  • 补丁分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档