XSS DOM 测试 dvwa DOM XSS 漏洞测试
DOM Based XSS:是基于DOM文档对象模型的操作,通过前端脚本修改页面的DOM节点形成的XSS,该操作不与服务器端进行交互,而且代码是可见的,从前端获取到DOM中的数据在本地执行,从效果上来说也是反射型XSS。
漏洞测试
low 级别
可知Select按钮选择参数,数据提交是以GET请求的方式
<?php # No protections, anything goes ?>
low 级别不存在Protect,可以非常简单的造成XSS攻击
构造payload
http://192.168.43.146/dvwa/vulnerabilities/xss_d/?default=%3Cscript%3Ealert%28%22XSS%22%29%3C/script%3E
当用户触发该URL时就会受到XSS攻击,有弹框出现
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; } } ?>
经过代码审计之后可知:array_key_exists检查数组里是否有指定的键名或索引,并且default值不为null,传递的数据中如果存在<script>标签,则会进入if条件,default默认赋值为“English”
stripos(string,find,start) 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。 参数 描述 string 必需。规定要搜索的字符串。 find 必需。规定要查找的字符。 start 可选。规定开始搜索的位置。 相关函数: strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写) strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写) strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
由于stripos函数的作用所以不能使用<script>标签,但是真的就不能使用该标签吗,答案是可以的,此处要利用到URL中的一个特殊字符‘#’,该字符后的数据不会发送到服务器端,从而绕过服务端过滤
构造payload
http://192.168.43.146/dvwa/vulnerabilities/xss_d/?#default=%3Cscript%3Ealert%28%22XSS%22%29%3C/script%3E
触发该URL,成功绕过服务端的过滤
假如真的不能使用<script>标签,也有另一种方法进行绕过服务端的检测
用img标签或其他标签的特性去执行js代码,比如img标签的onerror事件
构造payload
http://192.168.43.146/dvwa/vulnerabilities/xss_d/?default=</option></select><img src=# onerror=alert("xss")>
触发该URL,成功绕过服务端的过滤
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; } } ?>
代码审计之后可知:在服务器后端判断,要求default的值必须为select选择菜单中的值,这里继续用上面的#符号绕过即可,构造payload
http://192.168.43.146/dvwa/vulnerabilities/xss_d/?#default=%3Cscript%3Ealert%28%22XSS%22%29%3C/script%3E
成功绕过后端switch的限制
impossible 级别
Security level set to impossible
<?php # Don't need to do anything, protction handled on the client side ?>