1. 程式人生 > >淺談XSS跨站指令碼攻擊

淺談XSS跨站指令碼攻擊

 淺談 跨站指令碼攻擊(XSS)

一、概述

1、什麼是跨站指令碼攻擊

跨站指令碼攻擊(Cross Site Scripting),簡稱XSS,  是指:由於網站程式對使用者輸入過濾不足,致使攻擊者利用輸入可以顯示在頁面上對其他使用者造成影響的程式碼來盜取使用者資料、利用使用者身份進行某種動作或者對訪問者進行病毒侵害的一種攻擊方式。
直白點:惡意攻擊者往Web頁面裡插入惡意Script程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script程式碼會被執行,從而達到惡意攻擊使用者的目的。

不同於大多數攻擊(一般只涉及攻擊者和受害者),XSS涉及到三方,即攻擊者、客戶端與網站。XSS的攻擊目標是為了盜取客戶端的cookie或者其他網站用於識別客戶端身份的敏感資訊。獲取到合法使用者的資訊後,攻擊者甚至可以假冒終端使用者與網站進行互動。

2、為什麼簡稱XSS,而不是CSS

跨站指令碼攻擊(Cross Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。

3、XSS漏洞成因

 XSS漏洞成因是由於動態網頁的Web應用對使用者提交請求引數未做充分的檢查過濾,允許使用者在提交的資料中摻入程式碼,然後未加編碼地輸出到第三方使用者的瀏覽器,這些攻擊者惡意提交程式碼會被受害使用者的瀏覽器解釋執行。

4、舉個例子

<?php  
     header("Content-Type: text/html; charset=utf-8");
     $username = $_GET["name"];
     echo "<p>Hi,".$username."!</p>";
?>

//這段PHP程式碼的主要作用是從URL獲取使用者輸入的引數作為使用者名稱,並在頁面中顯示“Hi,XXX”

(1)正常情況下:我們在url中輸入: http://localhost/test.php?name=Sam    

給引數name傳一個值Sam,顯示如下圖

(2)那麼,在非正常情況下呢(即:把傳遞給name的引數值改為一段可執行的Javascript程式碼)?

我們在url中輸入:http://localhost/test.php?name=<script>alert("My name is Sam");</script>

如果我們後臺沒有進行任何關於傳入引數值的過濾,會顯示如下圖結果

二、XSS生效方式

XSS主要有三種生效方式:(1)構造URL   (2)釋出內容式     (3)蠕蟲式

1、生效方式:構造URL

XSS攻擊者通過構造URL的方式構造了一個有問題的頁面;當其他人點選了此頁面後,會發現頁面出錯,或者被暗中執行了某些js指令碼,這時,攻擊行為才真正生效。

一般來說,動態頁面中會將url中的部分內容回寫在頁面中。以百度的搜尋為例,輸入網址:http://www.baidu.com/s?wd=<script>alert("wrong")<%2Fscript>

搜尋後會顯示如下頁面:

因為引數<script>alert("wrong")<%2Fscript>是<script>alert("wrong")</script>轉義後的結果,搜尋結果頁中,會在標題中中和搜尋框中回寫使用者輸入的內容。

如果這裡沒有經過轉義處理,則頁面中就嵌入了一段script,並執行該程式碼,並彈出對話方塊提示使用者。如果是其他惡意程式碼,則可能造成破壞。然後攻擊者將此URL廣為傳播——比如說,以報錯的方式發給百度的管理員,管理員開啟這個URL就中招了。

下面我們來通過下圖,圖解XSS

舉例

例1、

若未對XSS進行預防

我們在URL中正常輸入如下,搜尋結果會如下圖顯示:beijing  的相關詞條

如果在url中非正常輸入如下的話,檢視原始碼後input的value屬性值會自動變為  <script>alert("xss test")</script>

若已對XSS進行了預防,

非正常輸入後則會顯示如下圖:

例2、

若未對XSS進行預防,

在URL中輸入紅框中的值,搜尋後則顯示如下:

若已對XSS預防,

則搜尋結果如下圖:

2、生效方式:釋出式內容

構造URL攻擊方式傳播範圍有限,被攻擊者只要有基本的安全意識就可以避免,因此這種手段的危險性比較小。相比之下,通過發表內容構造的XSS的危害就大了很多。

在可以發表內容的論壇、討論區、吧、部落格、微博等網站上,使用者發表的內容會儲存起來,允許其他使用者瀏覽。這些儲存的內容顯示在頁面上的時候,如果沒有經過正確的處理,也會把攻擊者精心構造的內容顯示出來,訪問該內容的使用者就此中招。如果該頁面流傳廣泛,則影響會更加深遠。

拿 留言板舉例

例、

留言板的任務是把使用者留言的內容展示出來。正常情況下,使用者的留言都是正常的語言文字,留言板顯示的內容也就沒毛病。

然而這個時候如果有人不按套路出牌,在留言內容中丟進去一行”<script>alert(“mdzz”)</script>
之後當瀏覽這條留言的時候,就會彈出如下資訊框。

3、生效方式:蠕蟲式

最暴力的方式是使用蠕蟲——就是首先發一個有問題的文章,瀏覽者閱讀時會被暗中執行惡意程式碼,發表一篇新的文章的,該文章也含有同樣的惡意程式碼。這樣有可能在最快時間內將攻擊鋪滿整個網站。蠕蟲式攻擊將暗中偷偷摸摸的攻擊行為變成了光明正大的攻城拔寨,極容易被發現和修復。

Eg:早在2011年新浪就曾爆出過嚴重的xss漏洞,導致大量使用者自動關注某個微博號並自動轉發某條微博。(蠕蟲式)
它以吸引人眼球的方式,讓當微博使用者主動點選攻擊連結。之後微博網友會立刻執行一段有害程式碼,造成三個結果:釋出一條微博;成為攻擊發起人的粉絲;向其他好友傳送含同樣連結地址的私信。新浪微博很快發現這個漏洞,刪除了含攻擊連結的微博內容,並將攻擊發起人ID刪除。

注:上面我們只是為了方便以彈窗舉例,但是XSS攻擊方式絕不是彈窗這麼簡單

三、XSS攻擊例項

(1)XSS偷取使用者資訊

(2)XSS盜取Cookie

(3)XSS釣魚網站

(4)XSS蠕蟲攻擊
 

四、XSS的破壞方式

(1)破壞頁面結構:使用者輸入的內容包含了html的標籤,與前面的標籤等閉合,導致頁面的DIV結構發生變化,頁面錯亂。

(2)破壞顯示內容:使用者輸入的內容包含了單引號或雙引號,與前面的單引號或雙引號匹配,導致後面的內容丟失,顯示不出來。

(3)破壞JS:使用者產生的內容直接輸出到js片斷中,但僅轉義少數字符不能保證排除攻擊,所以容易導致JS被破壞
 

五、XSS攻擊 繞過過濾的一些簡單方法

1、大小寫繞過

這個繞過方式的出現是因為網站僅僅只過濾了<script>標籤,而沒有考慮標籤中的大小寫並不影響瀏覽器的解釋所致。

例:

如果我們在URL中輸入:  localhost/test.php?name=<script>alert(''hey!")</script>     

,由於網站對<script>標籤進行了過濾,所以搜尋後什麼都不會發生。

而如果我們輸入:  localhost/test.php?name=<sCript>alert(''hey!")</scRipt>  

,實質就是改變了<script>的大小寫,則結果如下圖所示,我們又愉快的彈出了彈窗。



2、利用過濾後返回語句再次構成攻擊語句來繞過

即我們輸入一串原始值,網站將輸入的原始值進行過濾,過濾後的值仍是一段可執行的程式碼。

讓過濾完script標籤後的語句中還有script標籤。
      即:<sCri<script>pt>alert("hey!")</scRi</script>pt> 過濾後
仍為可執行的JS程式碼<script>alert("hey!")</script>

如下圖:將引數name值設為<sCri<script>pt>alert("hey!")</scRi</script>pt>

,輸入後仍會出現彈窗


3、並不是只有script標籤才可以插入程式碼!

當script標籤已經被完全過濾後,前面兩種方法就都不會成功。
莫慌,能植入指令碼程式碼的不止script標籤。

例如:我們用<img>標籤做一個示範。
我們利用如下方式在URL中輸入:http://localhost/test.php?name=<img src='w.123' onerror='alert("hey!")'>  
之後就可以再次愉快的彈窗。(因為我們指定的圖片地址根本不存在也就是一定會發生錯誤,這時候onerror裡面的程式碼自然就得到了執行。)

以下列舉幾個常用的可插入程式碼的標籤。
<div onmouseover=‘do something here’> 當用戶滑鼠在這個塊上面時即可執行(可以配合weight等引數將div覆蓋頁面,滑鼠不劃過都不行)
類似的還有onclick,這個要點選後才能執行程式碼

4、編碼指令碼程式碼繞過關鍵字過濾。
有的時候,伺服器往往會對程式碼中的關鍵字(如alert)進行過濾,這個時候我們可以嘗試將關鍵字進行編碼後再插入,不過直接顯示編碼是不能被瀏覽器執行的,我們可以用另一個語句eval()來實現。【eval()會將編碼過的語句解碼後再執行】

alert(1)編碼過後就是\u0061\u006c\u0065\u0072\u0074(1),

所以構建出來的攻擊語句http://localhost/test.php?name=<script>eval(\u0061\u006c\u0065\u0072\u0074(1))</script>

如下圖執行後又會出現彈窗


5、組合各種方式
在實際運用中漏洞的利用可能不會這麼直觀,需要我們不斷的嘗試,甚至組合各種繞過方式來達到目的。

6、等等等············

六、如何防範 XSS攻擊

(1)PHP裡的htmlspecialchars()函式:把原生的html程式碼給變為符號實體

(2)下載htmlpurifier外掛:對內容過濾處理,直接能刪除html標籤

(3)HttpOnly:https://www.cnblogs.com/softidea/p/6040260.html

(4)CSP