DVWA—XSS 跨站指令碼攻擊
阿新 • • 發佈:2020-08-13
XSS概念:通常指黑客通過HTML注入纂改了網頁,插入惡意指令碼,從而在使用者瀏覽網頁時,控制使用者瀏覽器的一種攻擊。
XSS三種:
-
反射型XSS:<非持久化> 攻擊者事先製作好攻擊連結, 需要欺騙使用者自己去點選連結才能觸發XSS程式碼(伺服器中沒有這樣的頁面和內容),一般容易出現在搜尋頁面。
-
儲存型XSS:<持久化> 程式碼是儲存在伺服器中的,如在個人資訊或發表文章等地方,加入程式碼,如果沒有過濾或過濾不嚴,那麼這些程式碼將儲存到伺服器中,每當有使用者訪問該頁面的時候都會觸發程式碼執行,這種XSS非常危險,容易造成蠕蟲,大量盜竊cookie(雖然還有種DOM型XSS,但是也還是包括在儲存型XSS內)。
-
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就暫時沒轍了。