小心!攻击者可能会利用此新漏洞窃取您的私人(和草稿)WordPress帖子的标题!
截至目前,已有近十亿个网站使用 WordPress 构建,为各种规模的企业和组织提供支持。这使得任何新发现的漏洞都尤为令人担忧——例如 Imperva 研究人员最近发现并报告的漏洞,它可能影响任何 WordPress 网站。在这篇博文中,我们将解释此次攻击本身、导致此次攻击的条件,并提供演示。
我们负责任地向 WordPress 披露了此漏洞,并在 90 天后发布了我们的报告。
要立即了解如何检查您的网站是否存在漏洞以及如何减轻这种威胁,请直接跳至漏洞测试和缓解部分。
Imperva 发现并报告了一个可能影响所有 WordPress 网站的漏洞,该漏洞使威胁行为者有可能窃取敏感的私人和草稿帖子标题。为了保护您的网站,强烈建议您将 WordPress 网站更新到最新版本,并在不使用 XMLRPC 端点时将其禁用。
最后一部分提供了更多信息。
泄露 WordPress 博客文章的草稿或私人标题可能会过早暴露敏感信息,从而对公司造成严重损害。让我们来看几个例子来说明其潜在影响。
2012年,谷歌意外提前发布财报,导致股价暴跌9%,市值在几分钟内蒸发约220亿美元1。同样,2019年,谷歌拟收购Fitbit的消息在正式宣布之前泄露,导致股价波动,并因市场投机加剧和监管审查加强而使谈判复杂化2。此类未经授权的披露可能导致内幕交易、法律责任以及公司声誉受损。此类违规行为会削弱利益相关者之间的信任,并可能造成巨额财务损失。
我们发现,攻击者可以通过特制的 XMLRPC 有效载荷泄露所有私人或草稿帖子的标题。该攻击由一系列发送到受害者站点 XMLRPC 端点的 POST 请求组成。根据服务器响应请求的方式,攻击者可以逐步窃取私人和草稿帖子的标题。
此次攻击依赖于XMLRPC功能。自 WordPress 3.5(2012 年 12 月发布)以来,所有新安装的 WordPress 应用均默认启用该功能。该功能支持不同系统之间的标准通信,例如,使用 WordPress 以外的博客平台开发的网站。
XMLRPC 提供的功能之一是 ` pingback` 。
WordPress 的 pingback 功能会在您在文章中链接到其他博客时自动通知该博客,并在被链接的博客文章上创建一个类似评论的反向链接(前提是该博客支持 pingback)。流程如下:
问题出现在步骤 3 中。
博客 2 尝试验证 MySQL 数据库中是否确实存在与传入请求数据相对应的博客文章。
pingback 请求包含两个关键信息:据称包含链接的页面的 URL(pagelinkedfrom),也称为源 URL,以及链接到的博客 2 上的帖子的 URL(pagelinkedto),也称为目标 URL。
请求到达后,博客 2 会立即触发 xmlrpc_call 操作,允许任何插件或附加函数与此事件交互。然后,它会对输入参数进行过滤,以防止任何恶意数据造成损害。之后,它会通过替换 HTML 实体来规范化 URL。它会确保将 pagelinkedfrom 中的任何 &转换回 &,并在 pagelinkedto 中执行相反的操作,以保持正确的 URL 编码。
在继续操作之前,博客 2 会检查源 URL 是否有效。如果源 URL 为空或格式错误,则会返回错误,表明未提供有效的 URL。它还会验证目标 URL 是否指向其自身的网站。
随后,它会尝试解析并识别以下内容中的目标 URL 模式:
如果上述方法均不起作用,博客 2 将无法确定帖子 ID,并返回错误,指出无法使用目标 URL。
当目标 URL 中存在片段时,就会出现此问题。
在这种情况下,正则表达式会删除除 az 或 0-9 之外的任何字符,并在数据库中存在的任何帖子标题中搜索匹配项。但该查询不仅搜索公开帖子,还会匹配并返回任何现有的博客文章,包括私人帖子或草稿帖子。
如果匹配,博客 2 将访问源 URL 来验证它确实包含目标 URL。
因此,攻击者可以劫持此工作流,并在数据库中所有帖子标题(包括私人帖子或草稿帖子)中搜索任意字符串模式。在本文的后面,我们将此机制称为“Oracle”。下一节将详细描述攻击者如何利用它。