WordPress 是著名的开源 CMS(内容管理) 系统。近日,在 4.0 版本以下的 WordPress 被发现存在跨站脚本漏洞 (XSS),新版本的 WordPress 已经修复了这些问题。为了安全起见,建议站长们尽早更新到 WP 新版本。
该漏洞是由芬兰 IT 公司 Klikki Oy 的 CEO Jouko Pynnonen 发现的,只存在于 WordPress4.0 以下的版本中。据调查得知全球有 86% 的 WordPress 网站都感染了这一漏洞,也就意味着全球数百万的网站都存在着潜在的危险。一些知名网站也使用了 WordPress 软件,如 Time 、 UPS 、 NBC Sports 、 CNN 、 Techcrunch 和 FreeBuf:)
漏洞概述
WordPress 中存在一系列的跨站脚本漏洞,攻击者利用跨站脚本伪造请求以欺骗用户更改登录密码,或者盗取管理员权限。
如 Jouko Pynnonen 解释道:
当博客管理员查看评论时,评论中的漏洞代码会自动在其 Web 浏览器上运行。然后恶意代码会偷偷接管管理员账户,从而执行管理员操作。
为了证明他们的观点,研究人员创建了一个漏洞利用程序 (exploits) 。利用这个 exploits,他们创建了一个新的 WordPress 管理员账户,改变了当前管理员密码,并在服务器上执行了攻击 PHP 代码。
漏洞分析
问题出在 WordPress 的留言处,通常情况下留言是允许一些 html 标签的,比如、、等等,然而标签中有一些属性是在白名单里的,比如
标签允许 href 属性,但是 onmouseover 属性是不允许的。
但是在一个字符串格式化函数 wptexturize() 上出现了问题,这个函数会在每一个留言上执行,函数的功能是把当前的字符转义成 html 实体,比如把 「」 转义为 「」 。为了防止干扰 html 格式,wptexturize() 首先会以 html 标签为标准把文本分成若干段,除了 html 标签,还有方括号标签比如 [code] 。分割的功能是由下列正则表达式完成的。
在 wp-includes/formatting.php 代码的第 156 行:
$textarr = preg_split('/(<.*>|[.*])/Us', $text, -1,
PREG_SPLIT_DELIM_CAPTURE);
但是如果文章中混合着尖括号<> 和方括号 [] 会造成转义混淆,导致部分代码没有转义。
攻击者可以通过这个漏洞在允许的 HTML 标签中注入样式参数形成 XSS 攻击,比如通过建立一个透明的标签覆盖窗口,捕捉 onmouseover 事件。
漏洞利用测试
以下代码可以用于测试
[<a href="test" title="]">[" NOT VULNERABLE]
修复建议
这一漏洞很容易被攻击者利用,WordPress 官方建议用户尽快更新补丁,而在新版 WordPress 4.0.1 已经修复了所有的漏洞。
WordPress 官方于 11 月 20 日发布了官方补丁,目前大多数的 WordPress 网站上都会收到补丁更新提醒通知;如果有一些其他原因使得你无法更新补丁,Klikki Oy 公司还提供了另外一个解决方案 (workaround) 可以修复该漏洞。
wptexturize 可以通过在 wp-includes/formatting.php 开头增加一个返回参数避免这个问题:
function wptexturize($text) {
return $text; // ADD THIS LINE
global $wp_cockneyreplace;
额外提醒
如果你使用的是 WP-Statistics WordPress 插件,你也应该更新补丁。因为这些插件上也存在跨站脚本漏洞,攻击者同样可以实施攻击。