xss跨站腳本攻擊(Cross Site Scripting),是一種經常出現在web應用中的計算機安全漏洞,指攻擊者在網頁中嵌入客戶端腳本(例如JavaScript), 當用戶瀏覽此網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的。比如獲取用戶的Cookie,導航到惡意網站,攜帶木馬等。
大部分的xss漏洞都是由於沒有處理好用戶的輸入,導致攻擊腳本在瀏覽器中執行,這就是跨站腳本漏洞的根源。
xss攻擊類型
1.非持久型XSS攻擊
非持久型XSS(Non-persistent)又叫做反射XSS(Reflect XSS),它是指那些瀏覽器每次都要在參數中提交惡意數據才能觸發的跨站腳本漏洞。
非持久型XSS漏洞實際上大多數攻擊數據是包含在URL中的,類似這樣的:http://www.vicitim.com/vul.asp?hi=[code]。需要用戶的瀏覽器訪問到這個URL惡意代碼才執行,攻擊者一般會把URL發給用戶讓用戶通過瀏覽器去訪問。不過URL里面帶有稀奇古怪的代碼確實有點奇怪,為了掩人耳目,攻擊者可以發一個看起來沒問題的URL,再通過那個頁面跳轉到惡意的URL;甚至也可以讓一個域名轉向到惡意URL,把那個域名發給用戶。
2.持久型XSS攻擊
持久型XSS(Persistent)又叫做存儲XSS(Stored XSS),與非持久型XSS相反,它是指通過提交惡意數據到存儲器(比如數據庫、文本文件等),Web應用程序輸出的時候是從存儲器中讀出惡意數據輸出到頁面的一類跨站腳本漏洞。
持久型XSS攻擊就簡單一點,只要第一次把攻擊代碼提交到服務器就一勞永逸了。比如我在某個論壇發帖的時候,論壇沒有對傳入的HTML作處理,那么我就可以發一個帖子內容包含“<script>[code]</script>”的帖子。呵呵,然后就守株待兔地等着來看帖子的人執行惡意腳本了。持久型XSS漏洞是把惡意腳本存儲到了數據庫,訪問頁面的時候完全沒有預兆,所以它的危害也比非持久型XSS略微高一點。
常見的xss攻擊方法
1.繞過XSS-Filter,利用<>標簽注入Html/JavaScript代碼;
2.利用HTML標簽的屬性值進行xss攻擊。例如:<img src=“javascript:alert(‘xss’)”/>;(當然並不是所有的Web瀏覽器都支持Javascript偽協議,所以此類XSS攻擊具有一定的局限性)
3. 空格、回車和Tab。如果XSS Filter僅僅將敏感的輸入字符列入黑名單,比如javascript,用戶可以利用空格、回車和Tab鍵來繞過過濾,例如:<img src=“javas cript:alert(/xss/);”/>;
4. 利用事件來執行跨站腳本。例如:<img src=“#” onerror= “alert(1)”/>,當src錯誤的視乎就會執行onerror事件;
5. 利用CSS跨站。例如:Body {backgrund-image: url(“javascript:alert(‘xss’)”)};
6. 擾亂過濾規則。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>;
7.利用字符編碼,透過這種技巧,不僅能讓XSS代碼繞過服務端的過濾,還能更好地隱藏Shellcode;(JS支持unicode、eacapes、十六進制、十進制等編碼形式)
8.拆分跨站法,將xss攻擊的代碼拆分開來,適用於應用程序沒有過濾 XSS關鍵字符(如<、>)卻對輸入字符長度有限制的情況下;
9.DOM型的XSS主要是由客戶端的腳本通過DOM動態地輸出數據到頁面上,它不依賴於提交數據到服務器,而是從客戶端獲得DOM中的數據在本地執行。容易導致DOM型的XSS的輸入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、
Document.referrer、Window.name、Document.cookie、localStorage/globalStorage;
XSS攻擊防御
原則:不相信客戶輸入的數據
注意: 攻擊代碼不一定在<script></script>中
1.使用XSS Filter。
輸入過濾,對用戶提交的數據進行有效性驗證,僅接受指定長度范圍內並符合我們期望格式的的內容提交,阻止或者忽略除此外的其他任何數據。比如:電話號碼必須是數字和中划線組成,而且要設定長度上限。過濾一些些常見的敏感字符,例如:< > ‘ “ & # \ javascript expression "onclick=" "onfocus";過濾或移除特殊的Html標簽, 例如: <script>, <iframe> , < for <, > for >, " for;過濾JavaScript 事件的標簽,例如 "onclick=", "onfocus" 等等。
輸出編碼,當需要將一個字符串輸出到Web網頁時,同時又不確定這個字符串中是否包括XSS特殊字符(如< > &‘”等),為了確保輸出內容的完整性和正確性,可以使用編碼(HTMLEncode)進行處理。
2.DOM型的XSS攻擊防御
把變量輸出到頁面時要做好相關的編碼轉義工作,如要輸出到 <script>中,可以進行JS編碼;要輸出到HTML內容或屬性,則進行HTML編碼處理。根據不同的語境采用不同的編碼處理方式。
3.HttpOnly Cookie
將重要的cookie標記為http only, 這樣的話當瀏覽器向Web服務器發起請求的時就會帶上cookie字段,但是在腳本中卻不能訪問這個cookie,這樣就避免了XSS攻擊利用JavaScript的document.cookie獲取cookie:
