DRUPAL 8.x远程代码执行漏洞(CVE-2018-7600)

news2024/11/14 15:09:06

事件背景

框架漏洞收集

CVE-2018-7600有两个POC分别是7和8的,本文仅研究8版本的POC,与其它的文章不同的事,本文我将数据流向调试并记录下来了

漏洞说明

1. 漏洞原理:Drupal对表单请求内容未做严格过滤,因此,这使得攻击者可能将恶意注入表单内容,此漏洞允许未经身份验证的攻击者在默认或常见的Drupal安装上执行远程代码执行。

2. 组件描述:Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由由内容管理系统和PHP开发框架共同构成,在GPL2.0及更新协议下发布。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。

3. 影响版本: 7.x-8.x,本篇分析漏洞仅对版本8有效,版本7的是另外的利用点,但是CVE编号相同

漏洞复现

环境搭建:GitHub - drupal/drupal at 8.3.3

这里可能需要利用docker环境的命令配置一下,我自己的环境为:windows10、PHP7.1、电脑带有docker可使用composer命令生成vendor目录、需要提供yaml环境(https://www.cnblogs.com/yycode/p/16039854.html)、在php.ini文件中添加”yaml.decode_php=On“

然后访问/core/install.php进入安装界面,简单填数据库的信息安装即可

直接用payload

url : ?element_parents=account/mail/%23value&ajax_form=1

POST : form_id=user_register_form&mail[0][#lazy_builder][0]=passthru&mail[0][#lazy_builder][1][0]=whoami

命令执行成功

漏洞分析

漏洞的原因来源于框架的一个特点,即drupal采用引擎对数组渲染生成HTML表达

这里出现了两个问题,而这两个问题则就造成了漏洞的利用,一个是框架对数组数据的传入没有任何过滤,二是生成的表单最后会传入到drupal\core\modules\file\src\Element\ManagedFile.php的uploadAjaxCallback方法中解析,而在解析的过程中有几个框架自带的属性可以造成漏洞的利用

  • #access_callback
    由Drupal使用来确定当前用户是否有权访问元素。
  • #pre_render
    在渲染之前操作渲染数组。
  • #post_render
    接收渲染过程的结果并在其周围添加包装。
  • #lazy_builder
    用于在渲染过程的最后添加元素。

#access_callback 标签虽然callback回调函数可控,但需要回调处理的字符串不可控,导致无法利用

由于对数组无任何过滤输入,即可传入这些自带的属性,造成回调函数的利用,不过有个问题就是数据怎么传入,如何触发漏洞,从头开始分析,构造的HTML表单的key值一般都是前期写死的,而我们经过分析必须得向表单传入可控键才能触发漏洞,这个问题的解决方法就是一个很正常的功能造成的

打个断点监听一下,运行以后如下

说明在buildform打的断点没有停下来,不过如果再以上述步骤一模一样操作一遍会发现

可以看到在断点处停下来了,第二次请求就停下来了,说明用户存在的话断点会走到最后,将表单返回

这就是一个一般网站常用的便捷功能,当注册的用户或邮箱存在时会保留上次输入的信息,而保留的这部分数据可以导致了数据的输入,这些数据最后会流入到drupal\core\modules\file\src\Element\ManagedFile.php::uploadAjaxCallback中解析,而现在还是没有解决,如何才能修改表单的键,根据其它师傅的分析才明白可以利用注册中图片的一个传输获得payload的大概身影,尝试抓取直接上传图片的请求,可以得到如下

由于格式是multipart/form-data,不太方便,再查看缓存的POST

利用burp抓到的url以及缓存的POST,提取几个关键的参数伪造为application/x-www-form-urlencoded类型的请求即可,经过分析大概提取了如下几个关键参数

url中element_parents参数的内容是定位到表单的一个位置最后提取其中的数据,比如上传图片时为user_picture/widget/0,则会将$form表单下的user_picture下的widget下的0提取出来无论为数组还是元素,代码实现如下

经过测试GET参数还有ajax_form为必须,不是很清楚具体作用,根据参数名和回显数据猜测应该是保存的表单

POST提取出了三处,分别为form_id、mail、name,其中form_id是必须定位到注册接口的,mail和name都可以传入数据,但是经过测试发现name有过滤,不接受数组的传输,而mail无任何过滤,因此采用mail传值

接下来从drupal\core\modules\file\src\Element\ManagedFile.php::uploadAjaxCallback开始审计

explode()函数会把element_parents内容以斜杆划分为几个值的数组,接下来步入getValue

大概作用为递归查询$form中是否有$form_parents,有的话最后把值返回,没有则返回空,因此最后$form为我们构造恶意的键对应的值,往下继续看

根据上述可以大概了解$form现在有三个键,一个是我们传入的,一个是#suffix,一个是#prefix,最后$form被传入$renderer->renderRoot(),跟进查看

继续跟进render()查看

就和套娃一样,继续跟进doRender()

由于没有#access和#access_callback因此如上条件判断皆可跳过,往下走

这里又添加了一个键值,下面的条件判断依旧可以跳过

这里即是最开始说的几个框架自带属性功能#lazy_builder,这也是我构造payload一个方法,因此如果利用的是#lazy_builder攻击,则进入条件判断查看,根据如上大概需要构造的payload有如下几个要求

#lazy_builder对应的值为数组

#lazy_builder对应的数组有且仅仅包含两个键

#lazy_builder下键为1对应的值为数组,测试如下

继续看下面

array_diff()函数用于比较两个(或更多个)数组的值,并返回差集,差集仅仅限于前减后

根据上例,我们必须保证$elements的键值小于等于$supported_keys且不能比在里面的数据多些什么,但是根据前面的数据我们很显然无法达到要求,其中#suffix、#prefix、还有后来添加的#cache,因此此处无法绕过,会导致报错,那么真的就没有办法了吗?确实,在这一层没有办法了,那我们就不能进入#lazy_builder这层条件了,这说明了#lazy_builder不可用吗?其实并不是,跳过这个条件继续看下去

其中经过数据处理$children为一个0数组 $elements['#children']为空$theme_is_implemented为false

已知$children为0数组,则提出来的值为0,因此就相当于将$elements中0键对应的值重新循环了一遍,而这次循环不再带有#suffix、#prefix等其它的键,那我们是不是可以将原本恶意的数据封装在0数组里,然后就可以绕过之前#lazy_builder条件里的一个判断了,那么解决了之前的那个困惑,后面直接看到关键条件

根据分析两个参数都可控的条件下利用回调函数call_user_func_array()最后实现命令注入,payload的构造为

URL : ?element_parents=account/mail/%23value&ajax_form=1

POST : form_id=user_register_form&mail[0][#lazy_builder][0]=passthru&mail[0][#lazy_builder][1][0]=whoami

当然,这也仅仅是利用到一个#lazy_builder属性造成的漏洞,另外有一个#pre_render

但是$elements数据不能完全控制,导致这个利用点很鸡肋,只能用需要一个参数且对参数要求不严格的函数,如print_r、var_dump等

除此之外还有一个看着像是可以利用的,为#post_render

回调函数会把#post_render的值作为函数名,后面两个则作为参数

最后$elements['#children']取决于$elements['#markup'],因此控制$elements['#markup']的值即可

payload为

虽然未成功,但是经过测试发现call_user_func()函数一个问题,也就是两个参数时可能会出现的问题,测试一下便明白

不知道为什么,在本地测试时发现以变量传入就是会报错,而我尝试在在线平台测试时发现

可以看到在线平台则可以,这说明这个函数是有缺陷的,我大胆猜测可能是php版本的原因,于是在本地测了一下和在线一样版本7.4发现

报了500还是不行,猜测可能是配置原因或者是报错的一个设置,但是找不出来,不过#lazy_builder可以实现即可。

Referer

云鼎实验室:Drupal CVE-2018-7600 分析及 PoC 构造

揭开Drupalgeddon 2的神秘面纱 - 先知社区

【漏洞分析】Drupal远程代码执行漏洞(CVE-2018-7600)分析 – 绿盟科技技术博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

900就能上8000MHz的DDR5内存,光威神策做到了

这是一款定位于高端国产DDR5电竞游戏内存条的产品,而且是来自国产品牌,频率可以达到8000MHz,设计也是相当惊艳,重点在于它的价格是真的香,有需要的朋友可以冲了。 光威近期发布了一款神策系列DDR5内存条,相…

【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio完成简易通讯录

目录 🔆Cloud Studio 简介 操作步骤 1.登录 2.创建工作空间 3.初始界面 4.开发空间 5.保存自定义模板 🔆简易通讯录 1.实验要求 2.操作环境 3.源代码介绍 3.1 定义通讯录类 3.2 定义通讯录列表 3.3 添加联系人功能 3.4 修改联系人 3.5 …

Echarts 柱状图显示百分比

以下是生成的 option option {yAxis: { name: 金额(元), type: value },xAxis: { type: category },legend: {},series: [{stack: x,name: 早餐,label: {normal: {show: true,position: insideRight,// 格式化显示formatter: function (params) {let …

清楚知道谁在划水?伙伴云一招搞定任务交办

伙伴云任务交办让每个职场人都拥有专属的事务汇集地, 让老板一张图把控全局,运筹帷幄, 让员工每天的工作井然有序,让每件事的进展都有始有终、形成闭环。一起来看看吧! 01企业内部任务管理的重要性 对于一家公司或一…

Java泛型的简单认识

泛型的认识 自定义泛型,定义了String类型,随后这个泛型就是String类型 于是他的方法都是字符串的类型 泛型接口 泛型方法 所有车可以进行比赛,定义了一个BMW和BENZ两个车类,都继承car,当使用泛型的 如果你顶一个狗对象…

Centos7 安装tomcat9

去官网下载 数据包 ps: wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.78/bin/apache-tomcat-9.0.78.tar.gz检查Java环境 [tomcatlocalhost bin]$ java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java H…

品牌渠道治理的有效方法

什么是品牌渠道,即品牌的销售渠道,围绕销售渠道做的治理工作,根本上是对低价、窜货的治理,当渠道中存在低价问题,那不管是对经销商还是非授权店铺,都会有不好的影响,经销商会跟价,非…

派森编程软件python好学吗,派森语言python干什么的

大家好,小编来为大家解答以下问题,派森编程软件python有什么用,派森编程软件python好学吗,现在让我们一起来看看吧! 1、python真的值得学吗? 不建议学python的原因: 1、语言性能差 对于C老手…

ACL访问控制列表(红茶三杯CCNA)

ACL的两大主要功能: 1. 流量控制 2. 匹配感兴趣流量ACL分为两类 Standard ACL-标准访问控制列表 只能根据源地址做过滤针对整个协议采取相关动作(允许或禁止) Extended ACL-扩展访问控制列表 能根据源、目的地址、端口号进行过滤能允许或拒…

实验四 汇编语言程序上机过程

五、实验步骤 1、用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为Hello.ASM。将源文件放到Dosbox挂载的目录下面。 图5-1为源码写注释并更改扩展名为Hello.ASM 2、用MASM对源文件进行汇编,产生Hello.OBJ文件和Hello.LST文件。若汇编时提示有错,用文字编辑工具修改源程…

YAPI接口自动鉴权功能部署详解

安装准备 以下操作,默认要求自己部署过yapi,最好是部署过yapi二次开发环境。 无论是选择在线安装或者是本地安装,都需要安装client工具。 1、yapi-cli:npm install yapi-cli –g, 2、安装后将文件夹nodejs/node_gl…

Nexpose v6.6.208 for Linux Windows - 漏洞扫描

Nexpose v6.6.208 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, Release Jul 27, 2023 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.o…

10分钟带你实现一个Android自定义View:带动画的等级经验条

先展示一下静态效果图 介绍一下我们的实现流程: 首先整个经验条有一个圆角边框的背景打底;然后给经验条绘制一条轨道,让用户比较直观地看到总进度的长度;在轨道的上层绘制我们的渐变色经验条;在经验条的上层绘制等级…

vue新学习 02 vue命令v-model,数据代理(作用域和作用域链),事件,监听,渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model: v-bind的命令是单项去绑定data中的相关属性,此时的data是真正的data,并没有用变量声明的方式去接收vue实例对象,也就是例如用const vm new Vue({})。而是直接就采用了new Vue({})这…

6、Kubernetes核心技术 - Pod

目录 一、概述 二、Pod机制 2.1、共享网络 2.2、共享存储 三、Pod资源清单 四、 Pod 的分类 五、Pod阶段 六、Pod 镜像拉取策略 ImagePullBackOff 七、Pod 资源限制 八、容器重启策略 一、概述 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。P…

oracle12c静默安装

目录 前言 安装配置步骤 关闭防火墙,禁止防火墙开机自启 关闭selinux yum安装必要安装包 内网环境下载依赖包的方式 创建用户和组 创建oinstall和dba组 创建oracle用户 设置oracle密码 查看创建结果 修改内核参数 使配置生效 修改用户及文件限制 改文件限制 修改用…

ol.Overlay+gif动画及隐藏问题

隐藏要使用css比较彻底,例如$("#markerLbs").hide()。 如果使用markerLbs.setVisible(false),当地图刷新后再次显示,可能我的用法不对,欢迎指教。 我的demo是一个gif动画,当zoom变化时控制gif显隐&#xf…

防汛备汛 | EasyV数字孪生可视化防汛应急解决方案护平安!

一、方案背景 汛期是指季节性降雨增多,河流湖泊水位上涨的时期。当前,我国正式进入“七下八上”防汛关键期,多地进入主汛期。入汛以来,我国经历了18次强降雨过程,21个省份271条河流发生超警以上洪水。其中南方地区受台…

Linux文件和目录的777、755、644权限解释

1.文件权限 在linux系统中,文件或目录的权限可以分为3种: r:4 读 w:2 写 x:1 执行(运行) -:对应数值0 数字 4 、2 和 1表示读、写、执行权限 rwx 4 2 1 7 (可读写运行) rw 4 2 6 (可读写不可运行) rx …

vue3+ts+vite项目中使用@时报错:找不到模块,两步教你快速解决

亲爱的小伙伴,如果你也在vue3tsvite项目中使用时报错:找不到模块的话,如下图情况,不要担心,不要害怕,两步教你解决! 1.找到tsconfig.json文件 2.添加如下代码即可 代码如下: "…