WordPress插件Jetpack存储型XSS漏洞原理分析及复现

2016年7月12日 475点热度 0人点赞 0条评论

图片  

       五月底,WordPress母公司Automattic发布了插件Jetpack 4.0.3版本

  在这个官方的WordPress论坛插件的版本中,修复了一个威胁程度较高的存储型XSS漏洞,小于4.0.3的版本都会被影响。

  本文通过实验复现了这个XSS漏洞,并分析其原理,不足之处,请大神指导。

  背景介绍

  5月12日:Sucuri安全团队向Jetpack的管理者报告了该漏洞;

  5月26日:Jetpack 4.0.3修复版本发布,并已解决该问题;

  5月27日:Sucuri安全团队发布漏洞细节。

  该漏洞是一个存储型XSS漏洞,攻击者可以利用漏洞在Web平台中植入恶意代码,而恶意代码会被存储于后台或数据库中,随后其他用户访问受影响页面时,便会执行攻击者植入的恶意代码,从而实现XSS攻击

  该XSS 漏洞存在于插件的短代码(shortcode Embeds)模块中

  WordPress Shortcode是指一些使用“[]”包含的短代码,例如”[vimeo123]”,而Jetpack的shortcode模块能够将[vimeo 123]替换成另外一个链接,创建了一个嵌套链接的HTML结构。 WordPress会识别这些短代码并根据短代码的定义输出为特定的内容,简单易用,功能强大。

  Jetpack插件中短代码模块介绍如下:

  图片

  开启Jetpack插件Shortcode Embeds模块的用户会受该漏洞影响。攻击者通过插件的shortcode模块,可在论坛文章评论中存储恶意代码。而这些评论会被存在到数据库中,如果Jetpack shortcode模块处于激活状态,后面浏览该评论的访问者会自动执行该恶意代码,这可导致管理员账户被攻击者劫持,注入SEO垃圾邮件到受影响的网页,将访问者重定向到恶意网站。

  实验复现

  XAMPP版本:5.6.15

  WordPress版本:4.5.2

  Jetpact版本:4.0.2

  1. 激活Jetpack的Shortcode Embeds 模块

  图片

  2. 发表一篇文章

  图片

  3. 在评论中输入

<a title='[vimeo 123]'><abbr title='onmouseover="alert(1338);"'>a7</a>

  图片

  4.结果

  当鼠标进过评论时,出现弹窗,XSS验证成功

  图片

  图片

  原理分析

  这个漏洞跟WordPress论坛插件bbPress存在存储型XSS很相似,也是由于某些文本被解释为HTML标签后产生。

  这个漏洞可以从wordpress的comment_text过滤器开始。用户添加评论,首先进过一些处理存储在数据库中,当打开存在评论的页面时,评论先从数据库中取出后,会触发comment_text过滤器,挂载在过滤器上的函数对其进行处理,最后显示在页面中。

  本实验中用到的最主要的挂载在comment_text过滤器上的函数为vimeo_link和wptexturize。

  图片

  vimeo_link的优先级最高优先执行,vimeo_link具体实现代码如下:

  图片

  它会通过正则表达式shortcode和plain_url匹配评论中是否有vimeo短代码或链接,正则匹配获取vimeo的id,例如实验中的123,然后调用vimeo_link_callback函数

  图片

  vimeo_link_callback函数检测id是否合法,合法则调用vimeo_shortcode函数产生对应的vimeo video的html代码。实验中的vimeo短代码”[vimeo123]“会被解释为:

<div class="embed-vimeo" style="text-align: center;"><iframe src="https://player.vimeo.com/video/123" width="474" height="267" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div>

  经过vimeo_link函数后,实验中输入的评论

<a title='[vimeo 123]'><abbr title='onmouseover="alert(1338);"'>a7</a>

  会被解释为:

<a title='<div class="embed-vimeo" style="text-align: center;"><iframe src="https://player.vimeo.com/video/123" width="474" height="267" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div>

' rel="nofollow"><abbr title=' onmouseover="alert(1338);"'>a7</a>

  然后它会被wp-includes\formatting.php中的wptexturize函数继续处理

  图片

  其中,php函数preg_split会将上面解释后的评论通过正则表达式

/(<(?(?=!--)!(?:-(?!->)[^\-]*+)*+(?:-->)?|[^>]*>?))/

  分割为数组

  图片

  然后进过一个foreach循环对每个数组元素进行处理,若一个数组元素中的单引号或双引号不在一个封闭的尖括号对(”<>“)中就会被转义

  图片

  被处理后的数组为:

  图片

  可以看到因为vimeo简码被解释为html代码,使a标签被错误的分隔,导致后面更多的错误,最后数组通过php函数implode对数组进行拼接,最后实验中评论被解释为:

<p><a title=' 

<div class="embed-vimeo" style="text-align: center;"><iframe src="https://player.vimeo.com/video/123" width="474" height="267" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe><br />

‘ rel=”nofollow”><abbr title=' onmouseover="alert(1338);"'>a7</abbr></a></p>

  因为title属性右边的单引号被转义,直到遇到abbr标签的title单引号为止,从而导致了弹窗出现。

  在Sucuri安全团队向Jetpack的管理者报告了该漏洞不久,Jetpack 4.0.3修复版本发布,修复版本中通过避免标签属性中的短代码被解释从而解决了该问题。有兴趣的可以自行研究。

  Reference

https://blog.sucuri.net/2016/05/security-advisory-stored-xss-jetpack-2.html 

WordPress自定义内容类型管理插件(CCTM)存在后门,可窃取管理员账号密码

WordPress 4.5.1的远程命令执行(附exp)

Wordpress漏洞来了!影响 130万网站

WordPress利用XSS漏洞Getshell

Wordpress 评论功能Xss 始末

比特币赞助打赏地址:13sbdFRyFBeqmXY9GJQf66s5cwmvLvWaAD白帽

图片长按公众号,可“置顶

----------------------------------

要闻、干货、原创、专业
关注“黑白之道” 微信:i77169
华夏黑客同盟我们坚持,自由,免费,共享!

图片

26170WordPress插件Jetpack存储型XSS漏洞原理分析及复现

root

这个人很懒,什么都没留下

文章评论