DVWA靶場通關----(10) XSS(DOM)教程


XSS(DOM) DOM型XSS

  XSS,全稱Cross Site Scripting,即跨站腳本攻擊,某種意義上也是一種注入攻擊,是指攻擊者在頁面中注入惡意的腳本代碼,當受害者訪問該頁面時,惡意代碼會在其瀏覽器上執行,需要強調的是,XSS不僅僅限於JavaScript,還包括flash等其它腳本語言。根據惡意代碼是否存儲在服務器中,XSS可以分為存儲型的XSS與反射型的XSS。

  DOM—based XSS漏洞是基於文檔對象模型Document Objeet Model,DOM)的一種漏洞。DOM是一個與平台、編程語言無關的接口,它允許程序或腳本動態地訪問和更新文檔內容、結構和樣式,處理后的結果能夠成為顯示頁面的一部分。DOM中有很多對象,其中一些是用戶可以操縱的,如uRI,location,refelTer等。客戶端的腳本程序可以通過DOM動態地檢查和修改頁面內容,它不依賴於提交數據到服務器端,而從客戶端獲得DOM中的數據在本地執行,如果DOM中的數據沒有經過嚴格確認,就會產生DOM—based XSS漏洞。

可能觸發DOM型XSS的屬性:

document.referer屬性

window.name屬性

location屬性

innerHTML屬性

documen.write屬性

XSS(DOM)主題:

 

Low

源碼解析

<?php
//沒有保護,什么都沒有
# No protections, anything goes

?>

漏洞復現

(1)什么保護都沒有,直接進行彈窗嘗試。

 

Medium

源碼解析

<?php

// Is there any input?
// array_key_exists()檢查鍵是否存在
array_key_exists() 函數檢查某個數組中是否存在指定的鍵名,如果鍵名存在則返回 true,如果鍵名不存在則返回 false。
提示:如果指定數組的時候省略了鍵名,將會生成從 0 開始並以 1 遞增的整數鍵名
array_key_exists(key,array)
key 必需    規定鍵名。
array    必需。規定數組
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
    $default = $_GET['default'];
    
    # Do not alLow script tags
//過濾<script,含scriipt的就不可以
stripos() 函數查找字符串在另一字符串中第一次出現的位置(不區分大小寫)
stripos(string,find,start)
string 必需    規定被搜索的字符串。
find 必需    規定要查找的字符。
start 可選    規定開始搜索的位置。
返回值:    返回字符串在另一字符串中第一次出現的位置,如果沒有找到字符串則返回 FALSE。注釋:字符串位置從 0 開始,不是從 1 開始。
    if (stripos ($default, "<script") !== false) {
//如果參數不含<script
header() 函數向客戶端發送原始的 HTTP 報頭
header(string,replace,http_response_code)
string 必需    規定要發送的報頭字符串。
replace 可選    指示該報頭是否替換之前的報頭,或添加第二個報頭。
默認是 true(替換)。false(允許相同類型的多個報頭)。
http_response_code可選    把 HTTP 響應代碼強制為指定的值。(PHP 4 以及更高版本可用)

        header ("location: ?default=English");
        exit;
    }
}

?>

漏洞復現

(1)簡單來說,就是過濾掉了“<script”,當函數匹配到 <script 字符串的時候就會將URL后面的參數修正為 ?default=English

(2)在這里可以通過onerror事件,在裝載文檔或圖像的過程中如果發生了錯誤就會觸發

構造payload(這里的標簽 </option></select> 是根據頁面源碼寫的):

English</option></select><img src=x onerror=alert(1)>

 

High

源碼分析

<
<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

    # White list the alLowable languages
//白名單,只允許French、English、German、Spanish
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }
}

?>

漏洞解析

(1)這里設置了白名單,如果default的值不為”French”、”English”、”German”、”Spanish”的話就重置URL為:?default=English ,這里只是對 default 的變量進行了過濾。

(2)可以考慮在English后面使用&或者#

構造payload:

English&<script>alert(1)</script>
English#<script>alert(1)</script>

 

 

Impossible

源碼解析

<?php

# Don't need to do anything, protction handled on the client side

?>

漏洞分析

  我們輸入的參數全部無效了,無法實現XSS。


免責聲明!

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



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