2 3 4 5 6 7 8 9 10 11 12

DOM型XSS

这种DOM型XSS用的相对较少,并且由于其特殊性,常见的漏扫工具都无法检测出来 .

Low级

实例:

// 前端3.html
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>DOM型XSS</title>
</head>
<body>
    <form action="action3.php" method="post">
        <input type="text" name="name" />
        <input type="submit" value="提交">
    </form>
</body>
</html>
// 后端action3.php
<?php
  $name=$_POST["name"];
?>
<input id="text" type="text" value="<?php echo $name; ?>"/>
<div id="print"></div>
<script type="text/javascript">
  var text=document.getElementById("text");
  var print=document.getElementById("print");
  print.innerHTML=text.value;  // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>

这里有一个用户提交的页面,用户可以在此提交数据,数据提交之后给后台处理

img

我们可以输入 <img src=1 οnerrοr=alert('hack')> ,然后看看页面的变化

img

页面直接弹出了 hack 的页面,可以看到,我们插入的语句已经被页面给执行了。

这就是DOM型XSS漏洞,这种漏洞数据流向是: 前端-->浏览器

Medium级

<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
    #先检查了default参数是否为空,如果不为空则将default等于获取到的default值。
    $default = $_GET['default'];
    # Do not allow script tags (不区分大小写)
    if (stripos ($default, "<script") !== false) {
        #使用了stripos 用于检测default值中是否有 <script  ,如果有的话,则将 default=English
        header ("location: ?default=English");
        exit;
    }
}
?> 

这里过滤了 <script (不区分大小写),那么我们可以使用<img src=1 οnerrοr=('hack')> ,使其访问URL,这时并没有弹出任何页面

查看网页源代码,发现语句被插入到了value值中,但是并没有插入到option标签的值中,所以img标签并没有发起任何作用。

所以此时先闭合前面的标签,我们构造语句闭合option标签:

<option value=' "+lang+" '> " +decodeURI(lang)+ "</option>

此时语句并没有执行,于是去查看源代码,发现我们的语句中只有 > 被插入到了option标签的值中,因为闭合了option标签,所以img标签并没有插入

于是继续构造语句去闭合select标签,这下我们的img标签就是独立的一条语句

查看源代码,可以看到,我们的语句已经插入到页面中了

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;
    #先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入的是默认的值。这样的话,我们的语句就没有可能插入到页面中了。
    }
}
?> 

Impossible级

<?php
# Don't need to do anything, protction handled on the client side
?> 

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

于是我们尝试访问链接, 发现页面并没有弹出任何东西,而且语言框内的值是我们输入的参数的经过URL编码后的数据

查看源代码,发现这里对输入的参数并没有进行URL解码,所以输入的任何参数都是经过URL编码,然后直接赋值给option标签。所以,就不存在XSS漏洞了。

笔记来源于: (51条消息) DVWA之DOM XSS(DOM型跨站脚本攻击)_谢公子的博客-CSDN博客

posted @ 2021-11-06 16:19  MrDevil  阅读(1533)  评论(0)    收藏  举报