WEB安全--XSS--DOM破坏

一、前言

继XSS基础篇后,我们知道了三种类型的XSS,这篇文章主要针对DOM型XSS的原理进行深入解析。

二、DOM型XSS原理

2.1、什么是DOM

以一个形象的比喻:

网页就像是一座房子,而 **DOM** 就是这座房子的“蓝图”或者“结构图”。房子的每个部分(如门、窗、墙壁)都代表网页上的某个元素,而 **DOM** 就是用来描述这些元素的工具,使得你可以清楚地知道哪里是门、哪里是窗,甚至改变它们的位置或大小。

所以通过DOM可以得到或者修改网页标签的属性。

举例:

<h1 id="header">Hello World</h1>
<button id="changeHeader">Change Header</button>
<script>// 获取 h1 标签和按钮let header = document.getElementById('header');let changeHeaderButton = document.getElementById('changeHeader');// 给按钮添加点击事件changeHeaderButton.addEventListener('click', function() {// 修改 h1 标签的文本内容header.innerText = 'New Header Text';});
</script>//点击按钮时,<h1> 标签的文本内容会从 "Hello World" 改为 "New Header Text"。

2.2、DOM破坏

DOM 破坏(DOM Clobbering)是指在 HTML 中,某些属性、元素的 ID 或名称等与浏览器自带的 DOM 对象(如 JavaScript 中的全局变量)发生冲突,导致原本应该是 DOM 元素的引用被覆盖或者破坏的现象。

也就是说,我们插入到浏览器的数据被接受并覆盖网页标签中本来就有的信息,那这就会造成DOM破坏。

举例:

img

这个例子可以看出原本是没有cookie这个属性的,然后我创建了一个div,再创建一个img,里面包含一个name属性,值为cookie。

接着把img放入div,把div放入document.body下,再调用document.cookie发现获取了这个img标签,这就说明document.cookie已经被我们用img标签给覆盖了。

这个例子可以看出原本是没有cookie这个属性的,然后我创建了一个div,再创建一个img,里面包含一个name属性,值为cookie。

接着把img放入div,把div放入document.body下,再调用document.cookie发现获取了这个img标签,这就说明document.cookie已经被我们用img标签给覆盖了。

实例(xss game第八关):

<h2 id="boomer">Ok, Boomer.</h2>
<script>boomer.innerHTML = DOMPurify.sanitize(new URL(location).
searchParams.get('boomer') || "Ok, Boomer")
//这里直接用DOMPurify框架过滤,那想直接绕过这个过滤显然不太可能setTimeout(ok, 2000)//此时我们试着从这个位置入手
</script>

setTimeout可以接受函数或字符串作为参数并执行它。

在这里,ok变量被执行,但它不存在;这里的JS代码是没有任何关于ok参数的定义的,所以我们可以使用DOM破坏,通过DOM破坏,将HTML元素注入到DOM中。

构造ok参数,因为setTimeout函数执行字符串,所以需要用到<a>或者<textarea>标签,因为这两个标签自带ToString方法。

payload:

    <a id=ok href="tel:alert(1)">a

        
当我创建这个<a>标签时,浏览器会自动在javascript中创建一个ok变量,当setTimeout(ok, 2000)运行时通过id=ok找到这个标签时<a>标签会调用ToString()方法,返回href中的值“tel:alert(1)”到setTimeout()中,最后setTimeout()将执行其中的语句。
这里需要注意的是我们要用DOMPurify框架白名单中的tel来替换javascript。

2.3、多层DOM破坏:

继XSS-GAME的DOM破坏之后,思考如果需要覆盖的数据是双层结构(x.y)该怎么办呢?

方法一、通过自定义方法写入双层字符 HTMLCOLLECTION:

 <div id="x"><a id="x" name="y" href="aaaa:1111"></a></div>
</body>
<script>alert(x.y);
</script>#这里实际上是创建了一个htmlcollection集合,然后通过collection[name]的方式来调用。

方法二、使用筛选出支持双选的标签:

form-button
form-fieldset
form-image
form-img
form-input
form-object
form-output
form-select
form-textarea

构建双层:

<from id="x"><output id="y">双层级</output><script>alert(x.y.value);
</script>

构建三层:

<form id="x" name="y"><output id="z">三层级</output></form>
<form id="x"></form><script>alert(x.y.z.value);
</script>

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

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

相关文章

Linux系统远程操作和程序编译

Linux系统远程操作和程序编译 了解和熟悉Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问和FTP文件传输操作 网络设置和用户创建&#xff1a; 在虚拟机Ubuntu系统中&#xff0c;将网络连接设置为“桥接模式”&#xff0c;并配置好IP和网关。确保其他Windows 10系统…

linux开发环境

1.虚拟机环境搭建 在 Ubuntu 系统中&#xff0c;打开&#xff08;如图中显示的窗口 &#xff09;常见快捷键有&#xff1a; Ctrl Alt T&#xff1a;这是最常用的打开终端的快捷键组合 &#xff0c;按下后会快速弹出一个新的终端窗口。 在 VMware 虚拟机环境中&#xff0c;若…

蓝桥·20264-祝福语--找连续字串的长度

#include <iostream> using namespace std; int main() {// 请在此输入您的代码//最小字典序&#xff0c;一定是全a&#xff0c;找s的最长字串a,结果就是该字串长度加1&#xff08;t不能是s的子串&#xff09;//所以这道题就变成了&#xff0c;找s中字串a出现的长度strin…

7.第二阶段x64游戏实战-分析人物属性

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;6.第二阶段x64游戏实战-分析人物状态 首先打开人物面板&#xff0c;查看人物的…

数组的常见算法一

注: 本文来自尚硅谷-宋红康仅用来学习备份 6.1 数值型数组特征值统计 这里的特征值涉及到&#xff1a;平均值、最大值、最小值、总和等 **举例1&#xff1a;**数组统计&#xff1a;求总和、均值 public class TestArrayElementSum {public static void main(String[] args)…

汽车电子笔记之:基于Tasking编译器怎么制作库文件并将库文件集成进工程释放

目录 1、概述 2、库工程创建、使用步骤 2.1、选择对应的MCU型号及空工程 2.2、选择需要封装的代码 2.3、将需要封装的代码复制到库工程 2.4、整理库工程工程属性 2.5、预留不生成库的.c源文件 2.6、编译生成.a文件 2.7、将.a集成进工程 2.7.1、创建释放给客户的工程 …

[ctfshow web入门] web29

前置知识 eval: 把字符串按照 PHP 代码来执行&#xff0c;例如eval(“echo 1;”);这个函数拥有回显 system&#xff1a;使php程序执行系统命令&#xff0c;例如&#xff0c;system(“ls”);就是查看当前目录&#xff0c;这个拥有回显 preg_match&#xff1a;查找字符串是否匹配…

7-8 超速判断

模拟交通警察的雷达测速仪。输入汽车速度&#xff0c;如果速度超出60 mph&#xff0c;则显示“Speeding”&#xff0c;否则显示“OK”。 输入格式&#xff1a; 输入在一行中给出1个不超过500的非负整数&#xff0c;即雷达测到的车速。 输出格式&#xff1a; 在一行中输出测…

【GESP】C++二级练习 luogu-B3721 [语言月赛202303] Stone Gambling S

GESP二级练习&#xff0c;多层循环分支练习&#xff0c;难度★✮☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-2-luogu-b3721/ 【GESP】C二级练习 luogu-B3721 [语言月赛202303] Stone Gambling S | OneCoderGESP二级练习&#xff0c;多层循环分支练习&am…

深入理解C++面向对象特性之一 多态

欢迎来到干货小仓库&#xff0c;堪比沙漠!!! 从“Hello World”到改变世界&#xff0c;中间隔着千万次再试一次. 1.多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c; 具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的…

蓝桥备赛指南(14):树的直径与重心

树的直径 什么是树的直径&#xff1f;树的直径是树上最长的一条链&#xff0c;当然这条链并不唯一&#xff0c;所以一棵树可能有多条直径。直径由两个顶点u、v来决定&#xff0c;若由一条直径&#xff08;u,v)&#xff0c;则满足一下性质&#xff1a; 1&#xff09;u、v的度数…

AIDD-人工智能药物设计-网络药理学-多组学与网络药理学分析揭示龟龄集治疗少精症的机制

IF6.7|多组学与网络药理学分析揭示龟龄集治疗少精症的机制 2024年10月28日&#xff0c;海军军医大学张卫东教授团队在Phytomedicine&#xff08;IF6.7&#xff09;上发表了题为“Multi-omics and network pharmacology approaches reveal Gui-Ling-Ji alleviates oligoastheno…

搜狗拼音输入法纯净优化版:去广告,更流畅输入体验15.2.0.1758

前言 搜狗输入法电脑版无疑是装机必备的神器。它打字精准&#xff0c;词库丰富全面&#xff0c;功能强大&#xff0c;极大地提升了输入效率。最新版的搜狗拼音输入法更是借助AI技术&#xff0c;让打字变得既准确又高效。而搜狗输入法的去广告精简优化版&#xff0c;通过移除广…

Franka双臂机器人:多领域革新与核心技术深度解析

双臂Franka机器人以类人化操作能力、毫秒级力控响应及智能协同算法为核心&#xff0c;持续推动工业自动化、医疗辅助与农业生产的革新进程。本文深度解析其技术突破与跨行业实践案例。 Franka双臂优势&#xff1a; 高灵活度&#xff1a;7自由度设计&#xff0c;模拟人类手臂运…

Django视图详解

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 一、Django视图是什么&#xff1f; 视图&#xff08;View&#xff09; 是Django处理HTTP请求的核心组件。它接收一个HttpRequest对象&#xff0c;处理业务逻辑&#xff0c;并返回一个HttpResponse对象&#xff08…

【工具变量】上市公安企业社会信任数据集(2004-2023年)

企业社会信任是衡量企业与社会之间信任度的重要指标&#xff0c;反映了企业在公众眼中的信誉和可靠性。社会信任对企业的持续发展和品牌形象有着至关重要的影响。本分享数据参考张维迎&#xff08;2002年&#xff09;的做法&#xff0c;采用中国企业家调查系统的地区信任调查数…

Python爬取数据(二)

一.example2包下的 1.re模块的compile函数使用 import repatternre.compile(r\d) print(pattern) 2.match的方法使用 import re patternre.compile(r\d) # m1pattern.match(one123twothree345four) #参数2&#xff1a;指定起始位置(包含),参数3&#xff1a;终止位置(包含),…

spring之Bean的循环依赖问题、反射机制手写Spring框架、Spring IoC注解式开发

一、Bean的循环依赖问题 1.什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 public class Husband {priv…

状态机的基本使用

状态机 1. 什么是状态机 1.1 场景 在业务代码中对一些业务状态进行硬编码&#xff0c;如果有一天更改了业务逻辑就需要更改代码&#xff0c;不方便进行系统扩展和维护。 if (status 状态1) {// TODO } else if(status 状态2) {// TODO } ...另外对订单状态的管理是散落在…

22 | 如何继续提升 Go 开发技术?

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战营 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;。 「Go 项目开发极速…