可以 没毛病
背景介绍
2018年3月28日,Drupal Security Team官方发布了一个重要的安全公告,宣称Drupal 6,7,8等多个子版本存在远程代码执行漏洞,攻击者可以利用该漏洞攻击Drupal系统的网站,执行恶意代码,最后完全控制被攻击的网站,该漏洞就是:CVE-2018-7600。
此消息一出,蠢蠢欲动的黑客们立马如天降尚方宝剑,都在暗处磨刀霍霍。
阿里云安全技术实验室也在第一时间采取了安全防御行动,统计发现云上有将近上万个Drupal系统的网站,其中Drupal系统的7.x版本占比56%左右,8.x版本的系统占比23.5%,这些版本都是该漏洞的重灾区。如果黑客对这些网站发起攻击,其影响不容小觑。阿里云安全技术实验室随后通知了相关的云上用户,并发布漏洞公告,指导用户如何进行修复和防御。
阿里云安全技术实验室对该漏洞进行持续跟踪和监控发现,云上仍有一些用户由于未及时打补丁,导致网站系统被攻破。我们发现该漏洞的利用方法简单、有效,成功率极高。而且黑客们利用该漏洞的从事的黑产种类,也是百花齐放,各有高招。下面我们就来分析一下黑客们是如何利用该漏洞来进行各种敛财、牟取暴利的。
漏洞原理
该漏洞的产生的根本原因在于Drupal对表单的渲染上。
Drupal为了在表单渲染过程中能够动态修改数据,从6.x版本开始便引入了"Drupal Form API"的概念。
相关文档如下:https://api.drupal.org/api/drupal/elements/8.6.x
这些"可渲染的数组(Renderable arrays)"就是引发此次漏洞的"元凶",它由一个key-value结构存储,其中key都以#
(hash sign)开头,如下所示:
[
‘#type’ => ‘markup’,
‘#markup’ => ‘<em>some text</em>’,
‘#prefix’ => ‘<div>’,
‘#suffix’ => ‘</div>’
]
Drupal在渲染这些"数组"时,将其中的数据未经安全过滤传入到doRender
函数中。
以下是doRender
函数调用call_user_func_array
函数的代码片段:
该方法取出"可渲染数组"#lazy_builder
的值,未经过滤直接传入call_user_func_array
函数,导致恶意代码被执行。
攻击链路还原如下:
- 黑客在"可渲染数组"中插入构造恶意代码,如:
mail[#post_render][]=恶意代码
- 通过POST方法将含有恶意代码的"可渲染数组"提交到drupal系统中。
- 页面渲染流程中,"可渲染数组"中携带的恶意代码依次经过
buildform
->uploadAjaxCallback
->renderRoot
->doRender
方法。 - 最终
doRender
方法将"可渲染数组"中的恶意代码取出,传入call_user_func
函数,导致恶意代码被执行,成功触发漏洞,网站沦陷。
相关代码
漏洞利用
自从漏洞CVE-2018-7600公布开始,阿里云安全技术实验室就持续跟踪和监控该漏洞的利用情况,发现黑客从2018-04-12开始就已经进行了大批量的漏洞攻击。从最近这段时间监控到的数据发现,已有多个黑客组织开始使用该漏洞来从事黑产活动。