在之前的文章中,我们介绍了反射型XSS以及存储型XSS,今天笔者将为大家讲述DOM型XSS,DOM全称为文档对象模型,与反射型存储型xss的不同之处在于其不会经过服务端的处理,而是经过JavaScript dom的渲染构造完dom树后,浏览器解析时才会被js的解析引擎解析执行。接下来我们通过DVWA的实例来看看
(一)low
只有一个下拉列表,没有后端代码,我们查看前端代码发现有如下内容
<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 + "'>" + (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>
选择下拉列表内容,其值会赋给default再添加到url的末尾,再将其传给option标签的value结点,由于没有任何过滤,我们输入xss语句即可触发,例如script>alert(document.cookie)</script>
等
(二)middle
前端源代码与low级别相同,但是加入了后端代码,代码如下
<?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;
}
}
?>
通过striops函数获取输入的<script的位置(不区分大小写)并将其进行过滤,果存在这些字符便会跳转到English选项的页面,提高了安全性,但是仍存在绕过的可能,例如使用标签类型的</option></select><svg/onload=alert(document.cookie)>
便可以绕过。
(三)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;
}
}
?>
可以发现使用了白名单的思想,只允许French,English,German以及Spanish,是否存在绕过的可能性呢,答案是肯定的,例如使用如下payload便会触发xss
English#</option></select><BODY ONLOAD=alert(document.cookie)>
可以看到我们在English之后添加了#,在url中#后边的内容不会发送到服务端,从而可以实现绕过。
(四)impossible
服务端并没有做什么,关键是在客户端的防护,help中是这样说的
The contents taken from the URL are encoded by default by most browsers which prevents any injected JavaScript from being executed.
浏览器一般都会对url中获取的内容进行编码,防止JavaScript注入
(五)漏洞利用与防御
我们可以利用xss获取cookie,篡改页面,钓鱼,记录键盘信息等,关于漏洞利用预防笔者在之前的文章中已经详细描述,在这里便不再赘述。
关于DVWA XSS系列的文章到这里就结束了,写的比较简单,有兴趣的读者可以自行尝试攻击防御等等,下期见。