XSS | DOM 型 XSS 攻击

news2024/11/18 11:24:04

关注这个漏洞的其他相关笔记:XSS 漏洞 - 学习手册-CSDN博客

0x01:DOM 型 XSS —— 理论篇

DOM 全称 Document Object Model,使用 DOM 可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。

DOM 型 XSS 是一种特殊类型的反射型 XSS,它是基于 DOM 文档对象模型的一种漏洞。

0x0101:知识前导 - DOM

HTML 的标签都是节点,而这些节点组成了 DOM 的整体结构 —— 节点树。通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。 所有 HTML 元素(节点)均可被修改,也可以创建或者删除节点。

比如下面这个 HTML 代码:

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <title>网页标题</title>
 </head>
 <body>
     <h1>我的标题</h1>
     <a href="">我的链接</a>
 </body>
 </html>

其对应的 HTML DOM 树的结构如下图所示:

在网站页面中有许多元素,当页面到达浏览器,浏览器会为页面创建一个顶级的 Document object 文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。

可以通过 JS 脚本对文档对象进行编辑,从而修改页面的元素。也就是说,客户端的脚本程序可以通过修改 DOM 动态修改页面内容,从客户端获取 DOM 中的数据并在本地执行。

由于 DOM 是在客户端修改节点的,所以基于 DOM 型的 XSS 漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段。

0x0102:DOM 型 XSS 攻击流程

常见的攻击方式: 用户请求一个经过专门设计的 URL,它由攻击者发布,而且其中包含 XSS 代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM 对象就会处理 XSS 代码,导致存在 XSS 漏洞。

其攻击流程如下图所示:

其整体攻击流程与反射型 XSS 很相似,只不过是因为 DOM 型 XSS 形成的原因比较特别,发现它的安全专家专门提出了这种类型的 XSS。出于历史原因,就把它单独作为一个分类了。

0x02:DOM 型 XSS —— 实战篇

实验工具准备

  • PHP 运行环境:phpstudy_x64_8.1.1.3.zip(Apache2.4.39 + PHP 5.3.29nts)

  • 实验源码包(附配置流程):DOMBasedXSSLab.zip

实验环境的搭建流程我放在了 DOMBasedXSSLab.zip 中了,这里就不多说了,下面直接开始演示。

0x0201:DOM 型 XSS 攻击

在浏览器的导航栏中输入下面的网址,访问实验环境:

 http://127.0.0.1/DOMBasedXSSLab/

可以发现页面发生了跳转,跳转到了一个 404 Not Found 的页面。值得注意的是,该页面回显的 404 - Page XXX Not Found 中的 XXX 部分的内容似乎是通过浏览器 URL 中的 error 参数控制的。

我们可以修改一下导航栏中 error 字段的内容,并重新访问:

 http://127.0.0.1/DOMBasedXSSLab/404.html?error=Blue17

可以发现,error 字段的内容果然会直接回显回页面中,我们右击页面查看网页源码,看看回显的位置:

发现我们传递的参数直接回显在了 <h1> 标签中,那么攻击者可以尝试构造下面的 Payload,来攻击用户:

 http://127.0.0.1/DOMBasedXSSLab/404.html?error=<img src=1 onerror="alert(/You've Been Tricked/)" hidden/>

可以看到,页面成功加载了攻击者传入的 XSS 代码并运行。如果点击了 “确定” 按钮,可以看到,页面基本没有啥影响(弹窗只是为了演示脚本确实被执行了,真攻击没人给你弄这种弹窗):

至此,一个 DOM 型 XSS 攻击的全流程已经演示完毕了。整体流程和反射型其实是差不多的,主要是代码处理方面的问题,反射型 XSS 是后端语言处理用户提交的数据后,将 XSS 攻击代码携带进返回包中传递给客户端;而 DOM 型则是利用用户客户端的 JavaScript 脚本进行触发的,后端返回的数据包中并不包含 XSS 攻击代码,如下图所示:

可以发现,后端返回的数据包中只有页面标签的布局,<h1> 标签中是没有任何内容的,这符合了我们上面讲的 DOM 型 XSS,后端返回的数据包中不包含 XSS 攻击代码的特点。

0x0202:DOM 型 XSS 代码分析

下面是触发 DOM 型 XSS 漏洞的关键代码:

 <h1 id="dom_output"></h1>
 <script>
 const urlParams = new URLSearchParams(window.location.search); // 获取链接中 ? 号后面参数的部分
 if (urlParams.has('error')) { // 如果用户传递了 error 参数
   const errorInfo = urlParams.get('error'); // 获取 error 参数的内容
   document.getElementById("dom_output").innerHTML = "404 - Page " + errorInfo + " Not Found 未找到"; // 输出回标题
 }  else { // 如果用户没有传递 error 参数
   document.getElementById("dom_output").innerHTML = "404 - Page Not Found 未找到";  // 输出回标题
 }
 </script>

DOM 型 XSS 程序只有 HTML 代码,并不存在服务器端代码,所以此程序并没有与服务器端进行交互,是一个纯粹的运行在客户端的 JavaScript 脚本代码触发的 XSS 漏洞。

用户访问实验环境后,会跳转到 404 页面,并向该页面传递参数 error=xxxurlParams 识别用户传递过来的参数并进行保存,如果用户传递了 ?error=xxx,则获取 xxx 具体的内容,并通过 document.getElementById("dom_output").innerHTML 的方式,找到 iddom_output 的标签(也就是 <h1> 标签),将用户传递过来的参数拼接并回显。如果用户没有传递 error 参数,则回显默认的内容:404 - Page Not Found 未找到

程序逻辑很简单,就是获取 error 字段的内容并回显,没有做任何过滤,导致了 XSS 漏洞。

当用户对 error 传入 <img src=1 onerror="alert(/You've Been Tricked/)" hidden/> 时, 输出到 <h1> 标签中的内容实际是:

 <h1>404 - Page <img src=1 onerror="alert(/You've Been Tricked/)" hidden/> Not Found 未找到</h1>

此 HTML 代码中包含了一个 <img> 图片标签,链接到地址 1 的图片,这个图片必然不存在,所以导致图片加载错误触发了 onerror 部分的内容,该部分又是一个 JavaScript 代码,此代码会引起浏览器的弹窗,而末尾的 hidden 仅仅是为了隐藏 <img> 标签,让其在页面上不那么显眼而已。

0x03:DOM 型 XSS —— 后记

在构造攻击语句的时候,笔者一开始并没有想用 <img> 标签来触发,笔者一开始构造的链接如下:

 http://127.0.0.1/DOMBasedXSSLab/404.html?error=<script>alert(/You've Been Tricked/)</script>

可以发现,JavaScript 脚本被成功内嵌进了页面,但是却并未被执行。笔者的思考是:由于浏览器解析网页的顺序是从上往下的,所以其执行顺序如下图所示(不知道对不对,反正笔者把自己说服了):

下面是文心一言给的参考中,我觉得最符合情况的一条:

浏览器 DOM 解析和渲染机制 当浏览器解析 HTML 文档时,它会识别 <script> 标签并尝试执行其中的脚本。但是,当脚本是通过 JavaScript 动态添加到 DOM 中时,浏览器会采取不同的策略。特别是,当脚本内容通过 innerHTMLdocument.write() 或其他类似方法动态添加到文档中的,浏览器不会立即执行这些脚本。这是因为浏览器需要区分 “正常的” HTML 解析过程中加载的脚本和后来通过脚本动态添加的脚本。

0x04:参考文献

  • 《Web 安全攻防:渗透测试实战指南》 ISBN 978-7-121-34283-7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统实现悬浮窗-菜单-悬浮按钮功能

文章目录 需求&#xff1a;系统实现悬浮窗菜单功能或悬浮小球定制功能实际手机产品效果悬浮窗作用 一、实际应用场景二、应用上面实现功能思路Demo演示效果部分源码分析Service层View层View初始化view 添加到窗体悬浮球拖动重点代码&#xff1a; 三、系统上面实现功能思路系统服…

秒懂Linux之信号

目录 信号的基本概念 信号的处理方式 默认动作 自定义处理信号 忽略该信号 信号的产生方式 kill命令 键盘组合键 系统调用 软件条件 异常 信号产生的深层理解 core的功能 信号的阻塞 内核中的表示 sigset_t 信号集操作函数 sigprocmask sigpending …

do while循环

/while(条件) {满足条件执行的代码&#xff0c;循环体 } /* do 做 */ while (false) { Console.WriteLine(" while循环执行了"); } do { //循环体逻辑 Console.WriteLine("dowhile循环执行了"); } while (true); Console.ReadLine(); /* w…

数据库索引:最左匹配原则——提升数据库的查询性能

数据库索引&#xff1a;最左匹配原则——提升数据库的查询性能 1、核心要点2、实例3、建议 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在数据库优化中&#xff0c;组合索引的使用深受最左匹配原则的影响。这一原则是提升查询效率的关键…

详细分析Nginx中的proxy_pass 末尾斜杠

目录 前言1. 基本知识2. Demo 前言 对于Nginx的讲解&#xff0c;更多推荐阅读&#xff1a; Nginx配置静态网页访问&#xff08;图文界面&#xff09;Nginx将https重定向为http进行访问的配置&#xff08;附Demo&#xff09;Nginx从入门到精通&#xff08;全&#xff09;详细分…

[Java EE] TCP 协议

Author&#xff1a;MTingle major:人工智能 Build your hopes like a tower! 文章目录 文章目录​​​​​​​ 一. TCP 协议 二. TCP 特性 1. 确认应答(ack) 2. 超时重传 3. 连接管理 三次握手 四次挥手 TCP状态 4 滑动窗口 5. 流量控制 6.拥塞控制 7. 延时应答 8.捎带应答 9…

前端性能初探

前端监控 提升稳定性&#xff0c;更快的发现异常&#xff0c;定位异常&#xff0c;解决异常&#xff0c;js错误&#xff0c;接口异常&#xff0c;资源异常&#xff0c;白屏等。 关注用户体验&#xff0c;建立性能规范&#xff0c;长期关注优化&#xff0c;页面性能&#xff0c…

TopOn对话游戏魔客:2024移动游戏广告应如何突破?

TopOn对话游戏魔客&#xff1a;2024移动游戏广告应如何突破&#xff1f; 近年来&#xff0c;游戏广告投放的成本日益走高&#xff0c;ROI如何回正&#xff0c;素材如何创新等问题困扰着每一个广告主。在隐私政策的实施下&#xff0c;广告投放难度也在不断升级。 据data.ai发布…

MK米客方德SD NAND参考设计

一、电路设计 参考电路&#xff1a; R1~R5 (10K-100 kΩ)是上拉电阻&#xff0c;当SD NAND处于高阻抗模式时&#xff0c;保护CMD和DAT线免受总线浮动。 即使主机使用SD NAND SD模式下的1位模式&#xff0c;主机也应通过上拉电阻上拉所有的DATO-3线。 R6&#xff08;RCLK&…

解决图片放大模糊

首先需要了解设备像素和CSS像素&#xff0c;CSS像素 是 Web 开发中的逻辑像素&#xff0c;设计者根据这些像素来布局页面。设备像素 是设备屏幕上的实际像素点数。 DPR 是 设备像素 和 CSS像素 的比率&#xff0c;所以进行缩放后&#xff0c;也需要对图片尺寸进行处理&#xf…

【HarmonyOS】鸿蒙自定义TabLayout示例

【HarmonyOS】自定义TabLayout代码示例&#xff0c;通过 Scroll 锚点 Tab 布局&#xff0c;滚动条会自动滚动使选中的标签居中显示。 class MyTabItem {label: string "";positionX: number -1; // 当前位置width: number -1; // 当前宽度constructor(label: stri…

OpenHarmony(鸿蒙南向)——平台驱动指南【HDMI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 HDMI&#xff08;High Definition Multimedia Int…

VS Code设置合集

目录 VS Code设置合集1、汉化2、VS Code自动报错3、VS Code右键没有Open In Default Browser4、VS Code设置颜色主题5、修改默认缩进字符 VS Code设置合集 1、汉化 点击插件 → 搜索chinese → 点击install&#xff0c; 同时按住ctrl shift P → 搜索>configure displ…

架构师:消息队列的技术指南

1、简述 消息队列(Message Queue, MQ)是一种异步通信机制,允许系统的各个组件通过消息在彼此之间进行通信。消息队列通过解耦系统组件、缓冲高峰期请求和提高系统的可扩展性,成为分布式系统中不可或缺的一部分。 2、工作原理 消息队列的基本工作原理是生产者将消息发布到…

Lesson08---string(4)类

Lesson08—string类&#xff08;4&#xff09; c第八章string类的实现 文章目录 Lesson08---string类&#xff08;4&#xff09;前言一、计算机是怎么储存文字的1. 在此之前先思考一个问题2.编码表2.1 ascll码2.2unicode码2.3UTF码2.4gbk码 二、实现一个简单的string1.构造函数…

【LeetCode】每日一题 2024_9_21 边积分最高的节点(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;边积分最高的节点 代码与解题思路 func edgeScore(edges []int) (ans int) {// 直接维护哈希最大值即可mp : map[int]int{}for i, v : range edges {mp[v] i// 如果多个节点的 边积分 相…

Flutter中使用FFI的方式链接C/C++的so库(harmonyos)

Flutter中使用FFI的方式链接C/C库&#xff08;harmonyos&#xff09; FFI plugin创建和so的配置FFI插件对so库的使用 FFI plugin创建和so的配置 首先我们可以根据下面的链接生成FFI plugin插件&#xff1a;开发FFI plugin插件 然后在主项目中pubspec.yaml 添加插件的依赖路径&…

PDF 秒变 JPG,2024 这些工具来助力

有些扫描仪默认将扫描文档保存为PDF格式&#xff0c;若事先未加留意&#xff0c;便可能累积大量PDF文件。然而&#xff0c;在需要将这些文件插入到其他文档或进行图形设计时&#xff0c;PDF格式可能会显得不够灵活或便捷。这时&#xff0c;将PDF转换为JPG图片格式就成为了一个实…

9.C++程序中的选择语句

选择语句一共分为两种&#xff1a;条件语句和开关语句 其中条件语句叫if语句&#xff0c;常见的形式为&#xff1a;if ... else ... ; 再复杂一些为if... else if ... else ... ; 开关语句又叫switch语句&#xff0c;类型于开关的使用形式常见的有 switch (var) case : ... b…

ai写论文哪个软件好?分享4款ai论文写作工具软件

在当前的学术研究和论文写作领域&#xff0c;AI技术的应用已经成为一种趋势。AI论文写作工具不仅能够提高写作效率&#xff0c;还能帮助研究者生成高质量的论文。以下是四款值得推荐的AI论文写作工具软件&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 传送…