很多網站為了避免XSS的攻擊,對用戶的輸入都采取了過濾,最常見的就是對<>轉換成<以及>,經過轉換以后<>雖然可在正確顯示在頁面上,但是已經不能構成代碼語句了。這個貌似很徹底,因為一旦<>被轉換掉,什么<script src=1.js></script>就會轉換成“<script src=1.js></script>”,不能執行,因此,很多人認為只要用戶的輸入沒有構成<>,就不能閉合前后的標簽,其語句當然也不會有害。
但是,萬事總有可能,只要有一定的條件,我們就可以構造經過編碼后的語句來進行XSS。
1.轉義字符
首先要認識一下“\”,這個不是斜杠么。對的,斜杠在JAVASCRIPT有着特殊的用途,它是轉義的符號。例如,我們把我們XSS語句轉換成16進制,這里是<script>alert(‘poruin’)</script>,我用在CHA88那里淘過來的腳本工具來轉換,如圖:(工具地址:http://tools88.com/safe/xss.php)
結果如下
\x3C\x73\x63\x72\x69\x70\x74\x3E\x61\x6C\x65\x72\x74\x28\x27\x70\x6F\x72\x75\x69\x6E\x27\x29\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E
這些就是經過編碼后的字符,因為前面的斜杠緣故,所以后面的這些字符在JAVASCRIPT中都會被還原。
我們再來看一下測試用的index.asp
<form name=form>
<input type=text name=text1>
<input type=submit name=submit>
</form>
<%
if request("text1")<> "" then
a=replace(replace(request("text1"),"<","<"),">",">")
end if
%>
<script>
a="<%=a%>"
document.write(a)
</script>
很簡單的內容,接受用戶的數據后過濾<>,再用JAVASCRIPT顯示出來,直接輸入XSS的測試語句看看,被轉換掉了吧。再來輸入經過16進制轉換后的字符,這些字符都可以輕松的逃過過濾,完整進入代碼中,經過JAVASCRIPT還原之后,正確解釋出來,如圖
而不但是十六進制可以,八進制同樣奏效,轉換后代碼如下:
\74\163\143\162\151\160\164\76\141\154\145\162\164\50\47\160\157\162\165\151\156\47\51\74\57\163\143\162\151\160\164\76
二.UBB標簽
UBB標簽是目前廣泛運用到論壇,留言簿,以及其他網站系統的一種編碼標簽,類似[img]url[/img]這樣的,用戶在中間輸入地址后即可,在發表的時候系統會自動改成<img src=”url”></img>。這個URL就是用戶輸入的圖片地址,XSS攻擊中,可以利用這個特點來達到無需用戶輸入<>就能執行由用戶所輸入的代碼,我們只要在輸入網址的地方輸入:
x"/**/onerror="alert('poruin')
那么經過轉換后就變成了
<img src="x"/**/onerror="alert('poruin')"></img>
在JS中空格可以用/**/轉換,如圖:
三.JS還原函數
JS中的編碼還原函數最常用的就是String.fromCharCode了,這個函數用於ascii碼的還原,一般來說,這個函數都要配合EVAL來使用才有效果。
在跨站中,String.fromCharCode主要是使到一些已經被列入黑名單的關鍵字或語句安全通過檢測,把關鍵字或語句轉換成為ASCII碼,然后再用String.fromCharCode還原,因為大多數的過濾系統都不會把String.fromCharCode加以過濾,例如關鍵字alert被過濾掉,那就可以這么利用:
<img src="x"/**/onerror="eval(String.fromCharCode(97,108,101,114,116,40,39,112,111,114,117,105,110,39,41))"></img>
執行效果如上圖一樣,沒有關鍵字同樣執行想要執行的代碼。
文章到此大致結束了,要知道在XSS中可以利用繞過過濾的技術遠不止這些,畢竟有防自然也會有攻,魔高一尺道高一丈,我寫這文章時間很短,都是依靠我自己的理解來寫的,有不正確的地方歡迎各位指出,也希望能和一些喜歡腳本安全或者是XSS的朋友一起討論這方面的內容。