首页
社区
课程
招聘
[翻译]未公开的Drupalgeddon2漏洞(CVE-2018-7600)
2018-5-2 08:46 4042

[翻译]未公开的Drupalgeddon2漏洞(CVE-2018-7600)

2018-5-2 08:46
4042

摘要

        两周前,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元素结构,比如页面、区块、节点等等。

        渲染数组包含了在渲染过程中使用的元数据。这些渲染数组是一个键-值结构,在该结构中属性键的开头是一个散列符号(#)。以下是一个示例:

[
‘#type’ => ‘markup’,
‘#markup’ => ‘<em>some text</em>’,
‘#prefix’ => ‘<div>’,
‘#suffix’ => ‘</div>’
]

Drupal系统补丁

        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系统成功对其进行渲染。

利用Drupalgeddon2研发武器

        现在,我们需要做的所有工作就是注入一个恶意的渲染数组,该数组利用某个Drupal系统的渲染回调函数来实现在系统中执行代码。

        有几个我们可以注入的属性:

        · #access_callback

        Drupal系统利用该属性,来确定当前用户是否对一个元素进行了访问。

        · #pre_render

        在渲染前对渲染数组进行处理。

        · #lazy_builder

        用于在渲染过程非常靠后的阶段添加元素。

        · #post_render

        接收渲染过程的结果,并为其添加包装器。

        对于我们所使用的PoC,我们选择#lazy_builder元素,作为注入到邮件数组中的元素。通过与AJAX API回调接口功能相结合,我们可以使得Drupal系统直接渲染我们的恶意数组。

        这使得我们能够接管管理员账号,安装恶意后门模块,并且最终在服务器上执行任意命令。

图6:向某个Drupal系统的渲染回调函数注入恶意命令

图7:利用恶意模块成功执行shell命令

总结

        在看了推特和一些安全博客上较早的文章之后,我们发现,很明显在这个漏洞公告相关的社群中存在着很多困惑,某些人甚至会对其严重程度表示质疑。因此,我们认为值得对其进行深入探讨。

        然而,这项研究非常具有挑战性,由于补丁模糊了真正的攻击向量,我们只能从一个非常庞大的攻击面开始入手。为了加快我们的研究发现进展,我们很荣幸地与Drupal系统平台中的专家一起合作。最终的结果突出强调了对于组织来说,在他们自身不犯错误的情况下,通过他们每天使用的第三方平台对其进行入侵是多么的容易。





原文网址:https://research.checkpoint.com/uncovering-drupalgeddon-2/
本文由  看雪翻译小组  木无聊偶  编译
转载请注明来源

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回