Drupal 爆远程代码执行漏洞,腾讯云网站管家率先发布应对策略

2018-04-25 21:58

  漏洞概要:

 早前,知名 CMS 系统 Drupal 被官方宣称存在严重安全漏洞(漏洞编号:CVE-2018-7600)。

  风险等级:官方定级为 “Highly Critical” 。

  影响范围:Drupal 7.X、8.X 版本中的多个子系统。

  漏洞危害Drupal 是全球三大开源内容管理系统 CMS 平台之一,被广泛应用于构造各种不同应用的网站项目。

  攻击者利用该漏洞对受影响版本的 Drupal 网站发动攻击,无需登录认证即可直接执行任意命令,包括下载重要文件,修改页面,上传 Webshll,篡改页面或进行挖矿等行为。最终可接管站点,而管理员还毫不知情。

  4月13日,网上公开了针对该漏洞的攻击命令。以下是云鼎实验室对该漏洞的详细技术分析。

  漏洞分析Drupal 在 3 月 28 日爆出一个远程代码执行漏洞,CVE 编号 CVE-2018-7600,通过对比官方的补丁,可以得知是请求中存在 # 开头的参数。Drupal Render API 对于 # 有特殊处理,比如如下的数组:

1.png

  比如 #prefix 代表了在 Render 时元素的前缀,#suffix 代表了后缀。

  通过查阅 Drupal 的代码和文档,可以知道,对于 #pre_render,#post_render、#submit、#validate 等变量,Drupal 通过 call_user_func 的方式进行调用。

  在 Drupal 中,对于 #pre_render 的处理如下:

2.png

  所以如果我们能将这些变量注入到 $form 数组中,即可造成代码执行的问题。

  但是由于 Drupal 代码复杂,调用链很长,所以导致了所谓“开局一个 #,剩下全靠猜”的尴尬局面,即使知道了漏洞触发点,但是找不到入口点一样尴尬。直到昨日,CheckPoint 发布了一篇分析博客,我才注意到原来 Drupal 8.5 提供了 Ajax 上传头像的点,并且明显存在一个 $form 数组的操纵。在已经知道触发点的情况下,构造剩下的 PoC 就非常容易了。

  PoC 构造CheckPoint 提供的截图显示,是在 Drupal 8.5.0 注册处,漏洞文件为:

  coremodules ilesrcElementManagedFile.php代码如下:

3.png

  代码第五行,取出 $_GET["element_parents"] 赋值给$form_parents,然后进入NestedArray::getValue 进行处理:

4.png

  NestedArray::getValue 函数的主要功能就是将 $parents 作为 key path,然后逐层取出后返回。举个例子,对于数组:

5.png

  及 $parents:a/b/c,最后得到的结果为 456。

  查看一下在正常上传中,传入的 $form:

6.png

  似乎 #value 是我们传入的变量,尝试注入数组:

  发现成功注入:

  那么通过 NestedArray::getValue 函数,可以传入 element_parents 为 account/mail/#value,最后可以令 $form 为我们注入的数组:

8.png

  在 Render API 处理 #pre_render 时候造成代码执行:

9.png

10.png

  Exploit 构造虽然实现了代码执行,但是 #pre_render 调用的参数是一个数组,所以导致我们不能任意的执行代码。不过 Render API 存在很多可以查看的地方,通过翻阅 Renderer::doRender 函数,注意到 #lazy_builder:

11.png

  #lazy_builder 是一个 array,其中元素 0 为函数名,元素 1 是一个数组,是参数列表。接着利用 call_user_func_array 进行调用。不过注意到上方这段代码:

  意思为传入的 $elements 数组中不能存在除了 $supported_keys 之外的 key,常规传入的数组为:

13.png

分享到:
收藏
相关阅读