漏洞详解。

DOM XSS(Cross-site scripting)是一种Web安全漏洞,它利用了浏览器的DOM(文档对象模型)解析机制,通过注入恶意代码来攻击用户。

DOM XSS与传统的反射型或存储型XSS有所不同。在传统的XSS攻击中,攻击者通常在网页的URL或表单字段中注入恶意代码,用户访问网页时恶意代码就会被执行。而在DOM XSS攻击中,恶意代码被注入到网页的DOM中,当用户与网页交互时,恶意代码就会被执行。

DOM XSS攻击的危害可能比传统的XSS攻击更加严重,因为它不需要将恶意脚本传递给服务器,因此很难检测和防止。攻击者可以利用DOM XSS来窃取用户的敏感信息、执行钓鱼攻击、劫持用户会话等。

DOM XSS漏洞的原因在于,浏览器在解析HTML和JavaScript时,将HTML和JavaScript混合在一起处理,因此恶意代码可以通过修改DOM节点或属性来注入到网页中。攻击者可以通过各种方式来实现DOM XSS攻击,例如修改URL参数、修改表单数据、使用可编辑的HTML元素等。

下面将演示一个DOM的操作实例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>DOM示例</title>
  5. </head>
  6. <body>
  7. <h1 id="title">Hello, World!</h1>
  8. <p>This is a paragraph.</p>
  9. </body>
  10. </html>
  11. JavaScript代码:
  12.  
  13. // 获取标题元素
  14. var titleElement = document.getElementById("title");
  15.  
  16. // 修改标题文本
  17. titleElement.innerHTML = "Hello, DOM!";
  18.  
  19. // 创建一个新段落元素
  20. var newParagraph = document.createElement("p");
  21. newParagraph.innerHTML = "This is a new paragraph.";
  22.  
  23. // 将新元素插入文档
  24. document.body.appendChild(newParagraph);

这段代码首先获取具有ID“title”的元素,并使用innerHTML属性将该元素的文本内容更改为“Hello,DOM!”然后,它创建一个新的段落元素,并使用createElement()方法和innerHTML属性将新元素的文本内容设置为“This is a new paragraph.”最后,它使用appendChild()方法将新元素添加到文档中。

下面我们将对四个等级的代码分别进行分析。

LOW:

代码审计:

  1. Unknown Vulnerability Source
  2. vulnerabilities/xss_d/source/low.php
  3. <?php
  4.  
  5. # No protections, anything goes
  6.  
  7. ?>

发现没有任何信息,直接查看网页源代码(这里截取的是我们要分析的部分)。

  1. <form name="XSS" method="GET">
  2. <select name="default">
  3. <script>
  4. if (document.location.href.indexOf("default=") >= 0) {
  5. var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
  6. document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
  7. document.write("<option value='' disabled='disabled'>----</option>");
  8. }
  9.  
  10. document.write("<option value='English'>English</option>");
  11. document.write("<option value='French'>French</option>");
  12. document.write("<option value='Spanish'>Spanish</option>");
  13. document.write("<option value='German'>German</option>");
  14. </script>
  15. </select>

这段代码是一个HTML表单,其中包含一个下拉菜单(<select>元素),名为default,并使用GET方法提交数据。当页面URL中存在default=参数时,该参数的值将被添加到下拉菜单中作为默认选项。

下拉菜单的选项内容由JavaScript代码动态生成。如果URL中存在default=参数,JavaScript将读取该参数的值并将其添加到下拉菜单中作为第一个选项。如果没有该参数,JavaScript将添加默认的四个选项:English、French、Spanish和German。

这里漏洞的产生,是因为JavaScript代码使用了document.write方法来将HTML代码动态写入到页面中。document.write()是一个JavaScript方法,它可以将文本、HTML代码或JavaScript代码写入到文档中。这里他没有对用户的输入做任何的过滤和验证。

漏洞利用:

  1. http://127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/xss_d/?default=<script>alert('XSS');</script>

在利用漏洞时我们只要在url中直接构建即可。

Medium:

代码审计:

  1. Unknown Vulnerability Source
  2. vulnerabilities/xss_d/source/medium.php
  3. <?php
  4.  
  5. // Is there any input?
  6. if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
  7. $default = $_GET['default'];
  8.  
  9. # Do not allow script tags
  10. if (stripos ($default, "<script") !== false) {
  11. header ("location: ?default=English");
  12. exit;
  13. }
  14. }
  15.  
  16. ?>
  1. 首先检测是否有default参数从HTTP GET请求中传递过来,如果有,则将其存到变量$default中。
  2. 接着,使用stripos()函数判断$default字符串中是否包含<script字符串,如果包含,则说明用户尝试注入脚本代码,这时候就将请求重定向到?default=English页面,并终止代码的执行。
  3. 如果$default字符串中不包含<script字符串,则说明用户的请求是安全的,可以继续在后续代码中使用。

那么通过代码审计我们可以得知对<script>标签进行了过滤,那么我们使用其他标签进行攻击。

漏洞利用:

  1. http://127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/xss_d/?default=</option></select><img src=x onerror=alert(1)>

<img>标签的onerror事件属性是一种常见的XSS攻击方式,在原本加载图片的过程中,如果这个图片无法正常加载,浏览器就会自动执行onerror事件属性中的JavaScript代码。攻击者可以利用这一点,将恶意代码放置在onerror事件属性中,一旦图片加载失败,该代码就会在用户浏览器中执行。除此之外,还有一些标签能进行XSS攻击。

  1. 攻击者可以在表单中插入一个带有onload属性的<img>标签,当该标签加载时,它可能会执行一个JavaScript函数,该函数会尝试从浏览器中获取敏感信息。
  1. <img src="hack.gif" onload="stealInfo()">
  1. iframe标签。攻击者可以向一个iframe标签中引用一个恶意网站,该网站可能包含一个恶意脚本,该脚本可能会执行跨源攻击。

  2. a标签。攻击者可以在一个<a>标签中插入一个恶意的href属性,该属性将指向一个恶意网站,当用户点击该链接时,它可能会导致跨站点脚本攻击。

High:

代码审计:

  1. Unknown Vulnerability Source
  2. vulnerabilities/xss_d/source/high.php
  3. <?php
  4.  
  5. // Is there any input?
  6. if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
  7.  
  8. # White list the allowable languages
  9. switch ($_GET['default']) {
  10. case "French":
  11. case "English":
  12. case "German":
  13. case "Spanish":
  14. # ok
  15. break;
  16. default:
  17. header ("location: ?default=English");
  18. exit;
  19. }
  20. }
  21.  
  22. ?>

这里进行了白名单验证。代码首先检查 GET 请求是否具有名为 'default' 的参数,并且该参数的值不为空。如果存在该参数,则使用 switch 语句对该参数进行检查,检查是否包含在允许列表中(指定为 "French", "English", "German" 或 "Spanish")。如果在允许列表中,则不进行任何操作,否则,将网页重定向到同一页面,但将 'default' 参数设置为英语("English")。

漏洞利用:

  1. http://127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/xss_d/?default=English#</option></select><BODY ONLOAD=alert(document.cookie)>

可以看到我们在default参数值后加上了#,需要注意的是,#号注释掉的原有代码并不会影响新插入的代码的执行,因为#号会把其后面的内容都注释掉,而不会对其前面的代码造成影响。

Impossible:

代码审计:

  1. Unknown Vulnerability Source
  2. vulnerabilities/xss_d/source/impossible.php
  3. <?php
  4.  
  5. # Don't need to do anything, protection handled on the client side
  6.  
  7. ?>
  1. <form name="XSS" method="GET">
  2. <select name="default">
  3. <script>
  4. if (document.location.href.indexOf("default=") >= 0) {
  5. var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
    // 这里的语句变了,并没有对我们输入的内容进行URL解码,所以我们输入的任何内容都是经过URL编码,然后直接赋值。因此不存在XSS漏洞。
  6. document.write("<option value='" + lang + "'>" + (lang) + "</option>");
  7. document.write("<option value='' disabled='disabled'>----</option>");
  8. }
  9.  
  10. document.write("<option value='English'>English</option>");
  11. document.write("<option value='French'>French</option>");
  12. document.write("<option value='Spanish'>Spanish</option>");
  13. document.write("<option value='German'>German</option>");
  14. </script>
  15. </select>

防御方法:

  1. 对用户输入进行过滤和验证:在客户端和服务器端都需要对用户输入进行正则表达式匹配和过滤,以确保用户输入不包含任何可疑字符或代码。

  2. 使用CSP:Content Security Policy (CSP)可以限制从哪些源加载资源(如脚本、图像、CSS等),以及哪些动作允许执行(如eval()、setTimeout()等)。通过在HTTP响应头设置CSP策略,可以防止XSS攻击。

  3. 消除DOM XSS源:通过使用框架或库提供的API,可以有效地避免DOM型XSS攻击。例如,使用jQuery的.text()和.html()方法来插入文本和HTML,而不是使用.innerHTML属性,可以避免一些DOM XSS攻击。

  4. 对JavaScript API进行限制:在某些情况下,为了保护网站免受XSS攻击,可以通过限制JavaScript API的访问来实现。例如,可以对document.cookie进行限制,可以使用HttpOnly标志来防止JavaScript访问cookie。

  5. 对输入进行编码:将用户输入作为HTML、CSS或JavaScript的字符串进行编码,以确保任何用户输入都不会被执行为恶意代码。

总之,防止DOM型XSS攻击需要综合使用上述措施,特别是对用户输入进行过滤和验证,并使用CSP限制恶意资源的加载和动作的执行。

DVWA-XSS(DOM)的更多相关文章

  1. DVWA XSS (DOM) 通关教程

    DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容.结构以及样式. DOM型XSS其实是一种特殊类型的反射型XSS,它是 ...

  2. DVWA靶场实战(十)——XSS(DOM)

    DVWA靶场实战(十) 五.XSS(DOM): 1.漏洞原理: XSS全称为Cross Site Scripting,由于和层叠样式表(Cascading Style Sheets,CSS)重名,所以 ...

  3. XSS DOM 测试

    dvwa DOM XSS DOM Based XSS:是基于DOM文档对象模型的操作,通过前端脚本修改页面的DOM节点形成的XSS,该操作不与服务器端进行交互,而且代码是可见的,从前端获取到DOM中的 ...

  4. DVWA XSS (Reflected) 通关教程

    XSS 介绍XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需 ...

  5. DVWA XSS (Stored) 通关教程

    Stored Cross Site Scripting 存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户 ...

  6. DVWA之DOM XSS(DOM型跨站脚本攻击)

    目录 Low Medium High Impossible Low 源代码: <?php # No protections, anything goes ?> 从源代码可以看出,这里low ...

  7. DVWA(xss部分源码分析)

    前言 DVWA靶场都不陌生,最新学习xss,从新又搞了一遍xss部分,从源码方面康康xss的原因,参考了很多大佬的博客表示感谢,网上也有很多DVWA靶场教程,就水一篇吧. 更多web安全知识欢迎访问: ...

  8. 1.4 DVWA亲测XSS漏洞

    首先需要有配置好的DVWA环境,像下图这样   其中: XSS (DOM) :  DOM型XSS漏洞 XSS (Reflected) : 反射性XSS漏洞  XSS (Stored) :  存储型XS ...

  9. XSS漏洞初窥(通过dvwa平台进测试)

    xss的全称是:Cross Site Script,中文名叫“跨站脚本攻击”,因为和CSS重名,所以改名XSS.作为一个网站是肯定要和用户有交互的,那么肯定就伴随着信息的输入输出,而利用xss就是通过 ...

  10. DVWA之Reflected XSS(反射型XSS)

    目录 Low Medium High Impossible Low 源代码: <?php header ("X-XSS-Protection: 0"); // Is ther ...

随机推荐

  1. 解决动态class展示问题

    由于部分涉及到隐私,就打马赛克了 比如这个小问题,我有这个动态的class,里面是十几个类似btn的按钮,然后每个btn下面又有子多选框,一开始是我点击那个下面的子级他的父级就被选中,默认选中第一个父 ...

  2. python菜鸟学习: 7. 购物车升级版,用户、商品信息存储,修改,新增

    # -*- coding: utf-8 -*-import os'''用户入口:1. 商品信息存在文件里2. 已购商品,余额记录商家入口1. 可以添加商品,修改商品价格商品信息:commdList.t ...

  3. 解决通过Eclipse启动Tomcat-Run On Server无法选择Tomcat v7.0的问题

    在eclipse中配置Tomcat并启动右键项目 -> Run As -> Run on Server可能会出现无法选择Tomcat v7.0的现象如下图,不慌菜鸟小编带你解决!1.定位到 ...

  4. GBDT中损失函数的负梯度用来拟合的一些理解

    将\(L(y_i,f(x_i))\)在\(f(x_i)=f_{m-1}(x_i)\)处泰勒展开到一阶(舍去余项,故为近似) \[L(y_i,f(x_i))\approx L(y_i,f_{m-1}(x ...

  5. QTreewidget树状列表右击事件

    树状列表右击事件(添加 删除 修改等操作) 思路:首先我们需要一个void contextMenuEvent(QContextMenuEvent * event); 管理Menu事件的一个接口 此接口 ...

  6. python3GUI--打造一款音乐播放器By:PyQt5(附下载地址)

    @ 目录 一.准备工作 1.PyQt5 2.qtawesome 二.预览 1.启动 2.歌曲搜索 3.歌曲播放 4.评论查看 5.自定义背景 6.设置-基本设置 7.设置-高级设置 8.定时任务 三. ...

  7. 实现Runnable接口

    1.定义一个类用于实现Runnable接口 2.重写run()方法,编辑代码逻辑体 3.创建线程对象,调用start()开启线程 案例:我在学习 1 public class study implem ...

  8. conda相关的设置备忘

    因为默认channel已经没有3.4.4(最后一个支持xp的python3)了,为了添加这个的版本,尝试先用conda-forge channel: conda create -n myenv pyt ...

  9. 解决navicat远程连接MySQL失败,报错1130问题

    1select host from user where user='root'; 2update user set host = '%' where user ='root';3flush priv ...

  10. 龙中华著《Spring Boot实战派》读书笔记之基础篇

    第四章 Spring Boot 基础 4.1 了解Spring Boot 项目结构 src/main/java //入口类,等 src/main/resources //静态文件和配置文件 src/t ...