-
-
[翻译]未公开的Drupalgeddon2漏洞(CVE-2018-7600)
-
发表于: 2018-5-2 08:46 4584
-
两周前,Drupal系统安全团队发现了一个极为严重(NIST机构评分为25/25)的漏洞,它的俗称是“Drupalgeddon 2”(编号为SA-CORE-2018-002/CVE-2018-7600)。一个未经认证的攻击者可以通过该漏洞在默认或通用Drupal系统安全环境下进行远程代码执行。
Drupal系统是一个开源的内容管理系统(Content Management System,CMS),全世界有超过一百万个网站(包括政府、电子零售、企业组织、金融机构等等)使用该系统,而所有这些站点在进行补丁修复之前都容易受到该漏洞的影响。
到目前为止,该漏洞的细节还没有公开,然而Check Point Research团队现在将详细描述该漏洞,并准确揭示它是如何生效的。
简单来说,Drupal系统没有对表单API(Form API,FAPI)接口的AJAX请求输入进行充分的检查。结果。这就使得攻击者能够偷偷地向内部表单结构中注入一个恶意的载荷。这将导致Drupal系统在未进行用户认证的情况下执行这个载荷。通过攻击利用这个漏洞,一个攻击者能够接管任何Drupal系统用户的整个站点。
该漏洞存在于从版本6到版本8的所有Drupal系统中,而对那些对自己站点进行手动升级的用户而言,相当于已经进行了补丁修复。在本文中,我们将针对一个Drupal系统旗舰产品(Drupal 8)的现成安装,展示真实的攻击场景。
首先介绍一些背景知识:Drupal系统的表单API接口是在Drupal 6首次引入的,这些接口使得用户能够在表单渲染过程中改变表单数据。这彻底改变了对标记进行处理的方式。
Drupal 7将表单API接口扩展为现在所谓的“渲染数组”。经过扩展的API接口被用于代表Drupal系统中的大部分UI元素结构,比如页面、区块、节点等等。
渲染数组包含了在渲染过程中使用的元数据。这些渲染数组是一个键-值结构,在该结构中属性键的开头是一个散列符号(#)。以下是一个示例:
Drupal系统发布的补丁增加了一个名为“RequestSanitizer”的简单类,其中有一个stripDangerousValues方法,该方法通过恢复输入数组中的所有项目,来获取以一个散列符号开头的键。该方法在Drupal系统引导程序非常早期的阶段(在加载站点配置之后立即进行),对$_GET,$_POST & $_COOKIES中的输入数据进行审查。
我们认为补丁以这种方式进行处理的其中一个原因是,为了使得寻找和利用漏洞更为困难。
出于以上原因,我们着重关注那些暴露在匿名用户面前的表单。
有一些可用的表单,其中之一就是用户注册表单。该表单包含了多个域,如以下截图所示。
图1:Drupal系统注册表单
我们知道我们需要向表单结构中的某个位置注入一个渲染数组,因此我们只需要找到这个位置。
碰巧的是,“电子邮件地址(Email Address)”域没有对它所收到的输入类型进行审查。这就使得我们能够像表单数组结构中注入一个数组(作为电子邮件域的值)。
图2:向注册表单的“mail”输入中注入我们的渲染数组
图3:被注入的表单渲染数组示例
现在,针对Drupal系统我们需要做的所有工作就是渲染被注入的数组。因为Drupal系统会将被注入的数组视为值而不是一个元素,所以我们需要诱使Drupal系统对其进行渲染。
在如下情况下,Drupal系统会对数组进行渲染:
1. 页面加载
2. Drupal系统的AJAX API接口会在某些情况下(比如,当一个用户填写了一个AJAX表单的时候)构造一个发往Drupal系统的请求,该系统将对一个HTML标记进行渲染,并更新表单。
在对围绕上述功能的可能攻击向量进行调查之后,由于提交后渲染过程以及Drupal系统实现该过程的方式,我们得出的结论是,一个AJAX API接口调用是我们实施攻击的最佳选择。
作为用户注册表单的一部分,“图片(Picture)”域利用Drupal系统的AJAX API接口来向服务器上传一张图片,并用一张上传图片的缩略图来替代它。
图4:利用AJAX API接口上传图片的表单
深入研究AJAX文件上传回调函数发现,它利用一个GET参数来定位表单的部分,该表单需要在客户端进行更新。
图5:AJAX ‘上传文件’回调函数代码
在将element_parents指向包含被注入数组的表单部分之后,Drupal系统成功对其进行渲染。
现在,我们需要做的所有工作就是注入一个恶意的渲染数组,该数组利用某个Drupal系统的渲染回调函数来实现在系统中执行代码。
有几个我们可以注入的属性:
· #access_callback
Drupal系统利用该属性,来确定当前用户是否对一个元素进行了访问。
· #pre_render
在渲染前对渲染数组进行处理。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!