1. 程式人生 > >XSS跨站指令碼攻擊----XSS攻擊的三種類型

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檔案並加入以下程式碼:

\\XSS反射演示
<form action="" method="get">
    <input type="text" name="xss"/>
    <input type="submit" value="test"/>
</form>
<?php
$xss = @$_GET['xss'];
if($xss!==null){
    echo $xss;
}

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

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

之後點選test:

我們輸入的HTML程式碼被執行了。用Firebug檢視,我們輸出的內容直接插入到了頁面中,解釋為<script>標籤。

反射型 XSS 的資料流向是:瀏覽器 -> 後端 -> 瀏覽器。

2.儲存型

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

\\儲存XSS演示
<form action="" method="post">
    <input type="text" name="xss"/>
    <input type="submit" value="test"/>
</form>
<?php
[email protected]$_POST['xss'];
mysql_connect("localhost","root","123");
mysql_select_db("xss");
if($xss!==null){
    $sql="insert into temp(id,payload) values('1','$xss')";
    $result=mysql_query($sql);
    echo $result;
}

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

新建show.php,內容為:

mysql_connect("localhost","root","root");
mysql_select_db("xss");
$sql="select payload from temp where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
   echo $row['payload'];
}

該程式碼從資料庫讀取了之前插入的內容,並將其顯示出來。

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

然後訪問xss.php,像之前一樣輸入 HTML 程式碼

點選test,點選之後卻發現沒有任何動靜,但事實上,我們的資料已經插入到了資料庫中。

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

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

瀏覽器 -> 後端 -> 資料庫 -> 後端 -> 瀏覽器。

3.dom-xss

把xss.php內容改為

<?php
error_reporting(0); //禁用錯誤報告
$name = $_GET["name"];
?>
<input id="text" type="text" value="<?php echo $name;?>" />
<div id="print"></div>
<script type="text/javascript">
var text = document.getElementById("text"); 
var print = document.getElementById("print");
print.innerHTML = text.value; // 獲取 text的值,並且輸出在print內。這裡是導致xss的主要原因。
</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那個專案就收到訊息了。