CVE20187600 Drupal核心远程代码执行漏洞分析

摘要:
0x01漏洞介绍Drupal是一个开源内容管理系统,全球超过100万个网站使用。两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CVE-2018-7600Drupal对表单请求内容未做严格过滤,因此,这使得攻击者可能将恶意注入表单内容,此漏洞允许未经身份验证的攻击者在默认或常见的Drupal安装上执行远程代码执行。0x02漏洞分析Drupal渲染数组的情况有页面加载和Ajax表单发出的请求,在这里AjaxAPI调用是攻击者最佳的选择。
0x01 漏洞介绍

Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用。两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CVE-2018-7600 Drupal对表单请求内容未做严格过滤,因此,这使得攻击者可能将恶意注入表单内容,此漏洞允许未经身份验证的攻击者在默认或常见的Drupal安装上执行远程代码执行。

0x02 漏洞分析

Drupal渲染数组的情况有页面加载和Ajax表单发出的请求,在这里Ajax API调用是攻击者最佳的选择。那么作为用户注册表单的一部分,图片字段使用Ajax API将图片上传到服务器,并且生成缩略图

CVE20187600 Drupal核心远程代码执行漏洞分析第1张

查阅了相关文档资料现在,我们所要做的就是注入一个恶意渲染数组,该数组使用Drupal的渲染回调方法在系统上执行代码。有几个属性我们可以注入:

CVE20187600 Drupal核心远程代码执行漏洞分析第2张

#access_callback 标签虽然callback回调函数可控,但需要回调处理的字符串不可控,导致无法利用。以下场景以post_render和lazy_builder为例

2.1、漏洞场景1:引入#post_render

#post_render

这个API标签可以被所有的元素和表单使用,它是在drupal_render()方法中调用,可以渲染当前元素和子元素,也可对内容进行修改。

CVE20187600 Drupal核心远程代码执行漏洞分析第3张

例子中$ element通过调用admin_form_html_cleanup函数处理返回处理后的结果。再来看可以触发攻击载荷的代码,在渲染的过程中调用了call_user_func进行回调处理,但$callable 回调函数通过表单伪造,$elements的子元素同样也是通过表单可控

CVE20187600 Drupal核心远程代码执行漏洞分析第4张

攻击者利用攻击载荷 mail[#post_render][]=passthru&mail[#type]=markup&mail[#markup]=whoami ,这里的#markup是当前元素#type的子元素,通过数组的方式传入值,执行过程如图

CVE20187600 Drupal核心远程代码执行漏洞分析第5张

魔术方法__toString得到$this->string 等于whoami ,带入到call_user_func中交给passthru函数执行,导致漏洞触发

CVE20187600 Drupal核心远程代码执行漏洞分析第6张

PHP内置函数pasthru执行后会回显结果

CVE20187600 Drupal核心远程代码执行漏洞分析第7张

2.2、漏洞场景2:引入#lazy_builder

#lazy_builder 可选,数组值,必须有且只有两个元素,一个是回调函数名,一个回调的参数,参数只能是NULL或者标量类型

CVE20187600 Drupal核心远程代码执行漏洞分析第8张

$callable变量取#lazy_builder元素标签数组下标0的值作为回调函数名,取数组下标1的值当回调方法的参数, 下面攻击载荷调用PowerShell 远程下载文件到本地保存为php网页后门,代码如下图

CVE20187600 Drupal核心远程代码执行漏洞分析第9张

CVE20187600 Drupal核心远程代码执行漏洞分析第10张

我们传入的lazy_builder[0]和lazy_builder[1]的值在渲染的时候用call_user_func_array完成整个攻击过程

CVE20187600 Drupal核心远程代码执行漏洞分析第11张

整个漏洞的产生过程都是因为call_user_func或者call_user_func_array等回调函数导致的任意代码执行,API元素标签中可能还会触发漏洞的标签有#theme 、#create_placeholder、#theme_wrappers等等。

0x04 缓解措施

官方在最新版本8.5.1中增加了下图方法

CVE20187600 Drupal核心远程代码执行漏洞分析第12张

对请求的GET、POST、COOKIE 进行过滤处理

CVE20187600 Drupal核心远程代码执行漏洞分析第13张

希望广大用户尽快升级到最新版本Drupal 8.5.1 , 下载地址:https://www.drupal.org/project/drupal/releases/8.5.1

0x05 Reference

https://research.checkpoint.com/uncovering-drupalgeddon-2/

https://github.com/g0rx/CVE-2018-7600-Drupal-RCE/blob/master/exploit.py

转载自:https://www.cnblogs.com/Ivan1ee/p/10187131.html

免责声明:文章转载自《CVE20187600 Drupal核心远程代码执行漏洞分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ditto在教学上的应用运维标准化与流程化建设深度指南(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(六)Android中Service通信

一、启动Service并传递参数 传递参数时只需在startService启动的Intent中传入数据便可,接收参数时可在onStartCommand函数中通过读取第一个参数Intent的内容来实现 1.MainActivity.java package com.example.shiyanshi.serviceconnected;import andro...

前端调用api接口方法总结

我用得最多的大概就是jquery中的ajax了吧,就从ajax总结起走: 一、ajax: 参数解释:(主要就用到url、type、data、dataType、success、error等,其他的看需求而定) $.ajax({   url:" ", //请求的地址,类型为string type:" ", //请求方式,两种“get”或者“...

Exchange ProxyLogon漏洞分析

Exchange ProxyLogon漏洞分析 前言 续前文继续学习Exchange漏洞 ProxyLogon 影响范围 Exchange Server 2019 < 15.02.0792.010 Exchange Server 2019 < 15.02.0721.013 Exchange Server 2016 < 15.01.2106...

js forEach参数详解,forEach与for循环区别,forEach中如何删除数组元素

 壹 ❀ 引 在JS开发工作中,遍历数组的操作可谓十分常见了,那么像for循环,forEach此类方法自然也不会陌生,我个人也觉得forEach不值得写一篇博客记录,直到我遇到了一个有趣的问题,我们来看一段代码: let arr = [1, 2]; arr.forEach((item, index) => { arr.splice(inde...

ICMP timestamp 请求响应漏洞

ICMP timestamp请求响应漏洞   解决方案: * 在您的防火墙上过滤外来的ICMP timestamp(类型13)报文以及外出的ICMP timestamp回复报文。   google之,于是动手解决:      具体解决方式就是禁用ICMP timestamp-request,编辑etc/sysconfig/iptables文件,在防火墙规则...

g_signal_connect 与 g_signal_connect_swapped

在 2.0 版,信号系统已从 GTK 移到 GLib,因此在函数和类型的说明中有前缀 "g_" 而不是 "gtk_"。我们不打算介绍 GLib 2.0 信号系统相对 GTK 1.2 信号系统扩展的细节。 在我们详细分析helloworld程序之前,我们会讨论信号和回调函数。GTK 是一个事件驱动的工具包,意味着它会等在 gtk_main() 那里,直到下...