手记

DVWA系列(三)DOM型XSS

在之前的文章中,我们介绍了反射型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系列的文章到这里就结束了,写的比较简单,有兴趣的读者可以自行尝试攻击防御等等,下期见。

1人推荐
随时随地看视频
慕课网APP