Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
drupal-oembed-ssrf — Drupal 11.4.8 - 高危 - 远程 - SSRF - oEmbed 发现获取未限定范围的第二跳 URL | Kitploit
工具/GitHubGitHub/abraxas/drupal-oembed-ssrf
漏洞分析漏洞利用Web应用程序漏洞利用安全虚拟化Web安全渗透测试
GitHubabraxas/drupal-oembed-ssrf

drupal-oembed-ssrf

Drupal 11.4.8 - 高危 - 远程 - SSRF - oEmbed 发现获取未限定范围的第二跳 URL

查看仓库
198天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Abraxas Labs - drupal-oembed-ssrf

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  drupal-oembed-ssrf

技术分析文章:https://abraxaslabs.tech/research/drupal-oembed-ssrf

drupal-oembed-ssrf

类别: SSRF 可达性: 远程

Drupal 核心 11.4.8(61044508)- Drupal

SA-CORE-2026-008 使用 media_oembed_discovery_trusted_host_patterns 对发现文档的主机进行了限制。UrlResolver::findUrl 仍然返回原始的 link href。随后 ResourceFetcher::fetchResource 对该 URL 发起 GET 请求,且不进行主机或私有 IP 检查。oEmbed 的 thumbnail_url 属于同一类 GET 请求。默认模式为空,因此在管理员启用之前,发现功能处于关闭状态。

在管理员开启发现功能后,能够创建 oEmbed 媒体的用户可以将 Drupal 指向一个白名单页面,该页面的 JSON oEmbed 链接 href 指向回环地址、RFC1918 地址或元数据地址。

ID暂无 CVE
类别SSRF(SA-CORE-2026-008 的第二跳遗留问题)
可达性远程(在管理员设置发现主机后,通过已认证的媒体创建操作)
CWECWE-918
CVSS中危:6.1 CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N
产品Drupal 核心
受影响版本11.4.8(61044508071749629aaf3380aa85971e94df9e84)
认证已认证的媒体创建操作,需管理员设置发现主机。AC:H 即指该管理员开关。
许可证GNU Affero GPL v3.0
实验环境仅 127.0.0.1

攻击者能做什么

仅在管理员设置了发现受信主机模式之后。此后,媒体创建者权限即可。完全没有账号的陌生人无法在默认配置下做到这一点。这是 SSRF,不是 RCE,也不是管理员登录。

权限方法 / 汇聚点类型实验验证或推断
使 Drupal 对攻击者选择的 URL 发起 GET 请求(本实验中为回环地址)UrlResolver::findUrl 原始 href,随后 ResourceFetcher::fetchResource GET侦察(服务端请求)实验验证。http://127.0.0.1:18080/oembed 返回了 DRUPAL-OEMBED-SSRF-WITNESS
将该 URL 的 HTTP 响应体读入 PHP同一 GET;JSON/XML 被解析为 oEmbed侦察实验验证。见证字符串出现在 200 响应体中
在资源构建后对 thumbnail_url 发起同样的 GETOEmbed::getLocalThumbnailUri 约 417-456 行侦察根据固定版本推断。本实验止步于发现的 href
若 PHP 网络命名空间可达,则访问 RFC1918 / 链路本地 / 元数据地址未加限制的 Guzzle GET侦察推断。实验使用回环地址,而非 169.254.169.254

在此遗留问题上已排除:模式为空时的第一跳(实验验证);HTML 主机不匹配时的第一跳(实验验证);在 Standard 配置下无媒体角色的未认证媒体创建;RCE;管理员会话窃取。

我是如何发现的

在 SA-CORE-2026-008 之后,我固定了 Drupal 11.4.8。第一跳受到限制:

$patterns = \array_map(static fn ($hostPattern) => \sprintf('{%s}i', $hostPattern), Settings::get('media_oembed_discovery_trusted_host_patterns', []));
// ...
if (!$allowed) {
  return FALSE;
}
$response = $this->httpClient->get($url);
return $this->findUrl($xpath, 'json') ?: $this->findUrl($xpath, 'xml');

findUrl 返回原始 href。ResourceFetcher 会带超时对其发起 GET 请求,除此之外不做任何其他处理:

$result = $xpath->query("//link[@type='application/$format+oembed']");
return $result->length ? $result->item(0)->getAttribute('href') : FALSE;
$response = $this->httpClient->request('GET', $url, [
  RequestOptions::TIMEOUT => $this->timeout,
]);

该实验是这 11.4.8 函数的忠实 gadget,而非实际安装的 drupal:11.4.8 站点。最后一行使用 how=gadget。空模式未获取。不匹配的主机未获取。在允许 ^firsthop$ 的情况下,discoverResourceUrl 返回了 http://127.0.0.1:18080/oembed,且未限定作用域的 GET 返回了见证。

已记录的误判:将默认关闭视为未命中(它是预期的第一跳门控;遗留的是第二跳);将实际运行的 Standard 安装称为 oracle(此包是固定函数);因 Guzzle 运行而声称 RCE。表演:反向 shell。oracle 是默认关闭加上错误主机被阻止加上第二跳见证。

相同的固定遗留项:CKEditor 5 FileIsImage skip。

实验

python3 drupal-oembed-ssrf-Abraxas-Labs.py

或

cd lab
./run.sh

仅限回环:第一跳 HTML 位于 http://127.0.0.1:19510。第二跳是 gadget netns 内的 http://127.0.0.1:18080/oembed。

SUCCESS drupal-oembed-ssrf how=gadget pin=11.4.8 first-hop=allowed second-hop=127.0.0.1:18080 default-off=blocked DRUPAL-OEMBED-SSRF-WITNESS

修复方案

对已发现的端点以及 thumbnail_url 应用相同的主机 / 私有 IP 策略。不要抓取那些主机本会在第一跳就校验失败的 href。

参考资料

  • github.com/drupal/drupal 标签 11.4.8(61044508071749629aaf3380aa85971e94df9e84)
  • UrlResolver.php · ResourceFetcher.php
  • 附近已修补(非本跳):SA-CORE-2026-008
  • 同一标签:drupal-ckeditor-fileisimage
  • CWE-918

许可证

GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。

下载工具