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。
