DVWA靶場通關----(11) XSS(Reflected)教程


XSS(Reflected) 反射型XSS

XSS攻擊需要具備兩個條件:

  • 需要向web頁面注入惡意代碼;
  • 這些惡意代碼能夠被瀏覽器成功的執行

XSS反射型漏洞

反射型XSS,顧名思義在於“反射”這個一來一回的過程。反射型XSS的觸發有后端的參與,而之所以觸發XSS是因為后端解析用戶在前端輸入的帶有XSS性質的腳本或者腳本的data URI編碼,后端解析用戶輸入處理后返回給前端,由瀏覽器解析這段XSS腳本,觸發XSS漏洞。因此如果要避免反射性XSS,則必須需要后端的協調,在后端解析前端的數據時首先做相關的字串檢測和轉義處理;同時前端同樣也許針對用戶的數據做excape轉義,保證數據源的可靠性

基本原理就是通過給別人發送帶有惡意腳本代碼參數的URL,當URL地址被打開時,特定的代碼參數會被HTML解析,執行,如此就可以獲取用戶的COOIKE,進而盜號登陸。

特點是:非持久化 必須用戶點擊帶有特定參數的鏈接才能引起。
XSS反射型攻擊,惡意代碼並沒有保存在目標網站,通過引誘用戶點擊一個鏈接到目標網站的惡意鏈接來實施攻擊的。

 

XSS(Reflected)主題:

 

Low

源碼解析

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
// arrary_key_exists()函數:判斷$_GET的值中是否存在“name”鍵名。並且$_GET[‘name’]的值是否不為空,滿足這些條件,直接輸出下面的輸出語句。

if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

漏洞復現

  服務器只是判斷了 name 參數是否為空,如果不為空的話就直接打印出來。服務器並沒有對 name 參數做任何的過濾和檢查。

(1)直接使用 <script>alert(1)</script> 進行嘗試

 

Medium

源碼解析

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
//將輸入中的<script>轉化為空
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?>

漏洞復現

(1)會檢查 name 參數中是否有 “< script >”,如果有則替換為空,也就是說過濾掉了“<script>”這個標簽。還有在這里使用了str_replace函數,它是區分大小寫的,因此可以使用大小寫繞過。

<sCript>alert(1)</ScRipt>

 (2)除了使用大小寫繞過,還可以使用雙寫繞過

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

 

High

源碼解析

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
//使用通配符,完全匹配script*N,所以有關script的標簽全被過濾
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?>

漏洞復現

  preg_replace() 函數執行一個正則表達式的搜索和替換,“*” 代表一個或多個任意字符,“i” 代表不區分大小寫。也就是說 “< script >” 標簽在這里被完全過濾了,但是我們可以通過其他的標簽例如 img、body 等標簽的事件或者iframe 等標簽的 src 注入 JS 攻擊腳本。

<img src = 1 onerror = alert(1)>

 

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
//轉碼
& (和號) 成為 &amp;
" (雙引號) 成為 &quot;
' (單引號) 成為 &#039;
< (小於) 成為 &lt;
> (大於) 成為 &gt;
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?>

漏洞解析

  htmlspecialchars() 函數用於把預定義的字符 "<" 和 ">" 轉換為 HTML 實體,防止了我們注入 HTML 標簽。例如我們注入 “”,htmlspecialchars 函數會將 < 和 > 轉換成 html 實體而不是當做標簽,所以我們插入的語句並不會被執行。同時加入 Anti-CSRF token 防護 CSRF 攻擊,進一步提高安全性。


免責聲明!

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



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