| 插件名称 | WPBakery 页面构建器 |
|---|---|
| 漏洞类型 | 存储型跨站脚本攻击 |
| CVE 编号 | CVE-2025-11160 |
| 紧急程度 | 低 |
| CVE 发布日期 | 2025-10-15 |
| 来源网址 | CVE-2025-11160 |
WPBakery 页面构建器 <= 8.6.1 — Stored XSS in Custom JS Module (CVE-2025-11160)
摘要:存储型跨站脚本攻击 (XSS) 问题影响 WPBakery Page Builder 版本至 8.6.1。攻击向量是插件的自定义 JS 模块,漏洞可以被具有贡献者级别权限的认证用户利用。供应商在 8.7 版本中发布了修复。此文档 — 由香港安全专业人士撰写,注重清晰和实用 — 解释了该问题的工作原理、谁面临风险、如何检测和移除有效载荷,以及应采取的即时缓解措施。.
- 漏洞:WPBakery 自定义 JS 模块中的存储型 XSS
- Affected versions: WPBakery <= 8.6.1
- 修复版本:WPBakery 8.7
- CVE:CVE-2025-11160
- 所需权限:贡献者(已认证)
- 报告的 CVSS:6.5(依赖于上下文)
- Primary impact: Persistent JavaScript execution in visitors’ and potentially admins’ browsers (cookie theft, redirects, persistent defacement, pivoting)
什么是存储型 XSS 以及它对 WordPress 的重要性
存储型 XSS 发生在攻击者在网站上存储恶意 JavaScript(在帖子、帖子元数据、小部件或插件管理的字段中),而网站随后在没有适当输出编码的情况下提供该内容。每当有人(包括管理员)查看受影响的页面时,有效载荷就会执行。.
为什么 WordPress 网站是高价值目标:
- 管理员面向的页面和预览可以执行有效载荷,从而实现凭证窃取或会话捕获。.
- 持久性脚本可以添加后门、注入 SEO 垃圾邮件或执行重定向和内容操控。.
- 具有用户注册或贡献者工作流程的网站尤其脆弱,因为低权限账户足以存储有效载荷。.
In this case the plugin exposes a Custom JS module intended for legitimate front-end scripts; inadequate input constraints and sanitisation allow a contributor to persist a malicious script that will be executed in visitors’ browsers.
技术概述:此 WPBakery 漏洞的工作原理
- 自定义 JS 模块将内容存储在数据库中(短代码、帖子元数据或插件特定存储)。.
- 来自贡献者级别用户的输入在保存和后续渲染之前没有得到适当的约束或清理。.
- 恶意贡献者可以注入 JavaScript,该 JavaScript 被存储并在任何查看页面的访客中返回。.
可能的攻击场景:
- 当管理员预览或访问感染页面时窃取管理员的 cookies 或会话令牌,然后将其导出到外部服务器。.
- 执行持久重定向到攻击者域,加载外部恶意软件或插入垃圾链接。.
- 使用 DOM 操作捕获表单提交或通过 REST API 或 AJAX 调用升级到其他操作。.
注意:该漏洞至少需要一个贡献者账户。许多网站允许注册或具有弱验证——这是攻击者的常见路径。.
谁面临风险?
- 运行 WPBakery Page Builder ≤ 8.6.1 的网站。.
- 允许用户注册或接受不受信任贡献者内容的网站。.
- 允许贡献者角色的多作者博客和社区或会员网站。.
- 任何管理员在登录状态下预览页面的网站(常见做法)。.
即使 CVSS 中等,单个暴露的贡献者启用网站如果目标是管理员,也可能导致严重的安全漏洞。.
立即采取行动(前 1-2 小时)
-
确认插件版本
Dashboard: Plugins > Installed Plugins and verify WPBakery version.
WP-CLI:
wp plugin list --format=csv | grep js_composer || wp plugin get js_composer --field=version -
如果可以,更新到 8.7 及以上版本
如果您的许可证和兼容性矩阵允许,通过仪表板或 WP-CLI 更新:
wp plugin update js_composer --clear-plugins-cache如果您无法立即更新,请应用虚拟补丁(请参见下面的 WAF 建议),同时安排更新。.
-
暂时限制贡献者访问
在您能够更新和扫描之前,删除或限制贡献者角色。移除低权限角色添加自定义 JS 模块的能力。.
- Scan for injected
- 内联事件处理程序:
onerror=,onclick=,onload= - 在盗窃/外泄中使用的 API 和函数:
document.cookie,XMLHttpRequest,获取,new Image() - 混淆:
base64,eval(atob(...)), ,长编码字符串 - Backup and snapshot: Preserve the current DB and file system for analysis.
- Remove or neutralise malicious entries:
- For script tags in post content, remove offending //g')"
- 更换凭据: 重置可能用于注入内容的任何帐户的密码。.
- 强制重置密码: 如果存在可疑活动,要求所有管理员和编辑重置密码。.
- 手动检查插件/主题: 审查任何允许存储 JavaScript 的插件或主题;优先对这些组件进行手动代码审查。.
- 加强注册和角色:
- 如果不需要,请禁用开放注册。.
- 将未验证的贡献者账户转换为更安全的角色或暂停它们。.
- 对用户生成的内容使用基于审批的工作流程。.
- 审查服务器日志: 查找在恶意内容出现时附近对 admin-ajax.php、REST API 端点或其他内容端点的 POST 请求。.
- 如有需要,恢复: 如果感染范围不明确,从已知干净的备份恢复,更新到修复的插件版本,并在扫描后重新引入内容。.
数据库搜索示例(小心转义特殊字符):
SELECT ID, post_title
FROM wp_posts
WHERE post_content REGEXP '
SELECT post_id, meta_key
FROM wp_postmeta
WHERE meta_value REGEXP '
WP-CLI / file scanning examples:
wp db export - | grep -iE '
grep -R --line-number -E "
If you find matches, document each affected post ID and meta key, export snapshots, and keep forensic copies before modifying content.
Containment & cleanup (detailed steps)
通过托管的 WAF(虚拟补丁)进行短期缓解。
如果无法立即更新,通过网络应用防火墙(WAF)进行虚拟补丁可以减少暴露。其目的是阻止利用尝试和已知有效负载模式,直到您可以更新和清理网站。.
概念性 WAF 规则示例(通过您的 WAF 或网关实施):