1. 程式人生 > 實用技巧 >DVWA—XSS 跨站指令碼攻擊

DVWA—XSS 跨站指令碼攻擊

XSS概念:通常指黑客通過HTML注入纂改了網頁,插入惡意指令碼,從而在使用者瀏覽網頁時,控制使用者瀏覽器的一種攻擊。

XSS三種:

  1. 反射型XSS:<非持久化> 攻擊者事先製作好攻擊連結, 需要欺騙使用者自己去點選連結才能觸發XSS程式碼(伺服器中沒有這樣的頁面和內容),一般容易出現在搜尋頁面。

  2. 儲存型XSS:<持久化> 程式碼是儲存在伺服器中的,如在個人資訊或發表文章等地方,加入程式碼,如果沒有過濾或過濾不嚴,那麼這些程式碼將儲存到伺服器中,每當有使用者訪問該頁面的時候都會觸發程式碼執行,這種XSS非常危險,容易造成蠕蟲,大量盜竊cookie(雖然還有種DOM型XSS,但是也還是包括在儲存型XSS內)。

  3. DOM型XSS:基於文件物件模型Document Object Model,DOM)的一種漏洞。DOM是一個與平臺、程式語言無關的介面,它允許程式或指令碼動態地訪問和更新文件內容、結構和樣式,處理後的結果能夠成為顯示頁面的一部分。DOM中有很多物件,其中一些是使用者可以操縱的,如url,location,referer等。客戶端的指令碼程式可以通過DOM動態地檢查和修改頁面內容,它不依賴於提交資料到伺服器端,而從客戶端獲得DOM中的資料在本地執行,如果DOM中的資料沒有經過嚴格確認,就會產生DOM XSS漏洞。

三種類型注入的方式大同小異,就只介紹反射型XSS(Reflected)。

LOW

  • 原始碼:
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?> 
  • 檢視原始碼,可以看到沒有對引數做任何防禦處理措施,直接輸出。

  • 嘗試一般的XSS攻擊<script>alert("你是豬")</script>

Medium

  • 原始碼:
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?> 
  • 可以看出來<script>標籤被自動遮蔽
  • 利用大小寫<Script>alert("你是豬")</Script>

High

  • 原始碼:
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?> 
  • 可以發現後端利用正則表示式徹底過濾了<script>標籤,可以用其他程式碼代替。
  • 插入一個錯誤的圖片,觸發onerror彈出<img src=# onerror=alert("你是豬")>

Impossible

  • 原始碼
<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?> 
  • 可以看到這裡用了htmlspecialchars防禦。

htmlspecialchars函式可以把預定義的字元&、"、'、<、>轉換為HTML實體,防止瀏覽器將其作為程式碼。

  • 這樣XSS就暫時沒轍了。