XSS- DOMclobbering与svg深度利用

embedded/2024/12/22 0:31:41/

目录

 源码展示

解法一:绕过过滤-DOM clobbering

什么是DOM clobbering

DOM clobbering原理 

全局变量自动创建

属性名冲突

影响脚本执行

逐过程分析


 源码展示

<script>const data = decodeURIComponent(location.hash.substr(1));;const root = document.createElement('div');root.innerHTML = data;// 这里模拟了XSS过滤的过程,方法是移除所有属性,sanitizerfor (let el of root.querySelectorAll('*')) {let attrs = [];for (let attr of el.attributes) {attrs.push(attr.name);}for (let name of attrs) {el.removeAttribute(name);}}    document.body.appendChild(root); </script>

题目分析:可以看到这是个明显的DOM XSS,用户的输入会构成一个新div元素的子结点,但在插入body之前会被移除所有的属性(例如:<img src=x οnerrοr=alert(1)> 经过上述代码过滤后会变为<img>,使得我们传入的数据失效)

解法一:绕过过滤-DOM clobbering

什么是DOM clobbering

DOM clobbering主要是用来进行DOM型的XSS攻击,其可以篡改JS函数原本的属性恶意插入一些XSS代码到页面的JS中去,它的特征就是利用了元素配置id或name属性后可以使用包括document、window、自己名称的形式进行访问(假如我们写了一个a标签,给他了一个id和name,那么我们就可以通过id或name来拿到这个a标签)。其可以对document的属性进行恶意的替换。特别是在元素的属性名与JavaScript全局对象的属性名冲突时,可能会破坏正常的DOM操作或脚本运行从而影响dom树的结构造成破坏。也是这一特性让它有了DOM COLBBERING这个名号。

DOM clobbering原理 

全局变量自动创建

当DOM元素拥有id或name属性时,浏览器会自动在全局作用域(即window对象上)创建一个同名的属性,指向该DOM元素。例如,<div id="foo">会创建一个window.foo属性,指向这个div元素。

属性名冲突

如果元素的id或name属性与已有的JavaScript全局对象或内置属性名冲突,会覆盖原有的JS代码。例如,如果有一个<input id="location">,它会覆盖window.location,这会导致脚本中试图访问window.location时得到<input>元素,而不是期望的Location对象。

影响脚本执行

由于全局变量被覆盖,脚本在访问这些全局变量时会得到意外的结果,导致错误或不可预测的行为。

实例讲解1:

控制台打印的结果为: 

 

通过上述结果分析可得:id和name中的值可以直接引用,引用的值即为标签的全部,但使用document可进行name引用,不可进行id引用。 DOM元素<img>拥有id属性=“x”,浏览器会自动在document对象上创建一个同名的属性document.x指向该DOM元素<img>,因此使用document.x可以直接抓取<img>标签,无需通过 getElementById 抓取<img>标签。

实例讲解2:

 

可以看到输出值为空

而当我们新创建的<div>标签中插入一个<img>标签并将该<div>标签插入到<body>中后,再利用document.cookie函数输出网页的cookie时,输出的结果却由空值改变成<img>标签

造成这一现象的原因:

         <img>标签拥有name属性=“cookie”,浏览器会自动在document对象上创建一个同名的属性document.cookie指向该DOM元素<img>
         浏览器创建的同名name=cookie属性与已有的JavaScript内置属性名cookie冲突,会覆盖原有的JS代码的作用即执行document.cookie时不是获取当前网页的cookie值而是抓取<img>标签

这种行为虽然有时可以方便地访问元素,但也会引发一些潜在的问题,特别是在元素的属性名与JavaScript全局对象的属性名冲突时,可能会破坏正常的DOM操作或脚本运行。我们可以利用这种方法。

逐过程分析

<script>const data = decodeURIComponent(location.hash.substr(1));;const root = document.createElement('div');root.innerHTML = data;// 这里模拟了XSS过滤的过程,方法是移除所有属性,sanitizerfor (let el of root.querySelectorAll('*')) {let attrs = [];for (let attr of el.attributes) {attrs.push(attr.name);}for (let name of attrs) {el.removeAttribute(name);}}    document.body.appendChild(root); </script>

payload:

<style>@keyframes x{}</style><form style="animation-name: x" onanimationstart="alert(1)"><input id=attributes><input id=attributes>

对代码进行调试(n+f12):

当程序走进第一个style标签中,因为没有属性,所以不会进行过滤

当走进form标签中时,因为form中还嵌套了两个input标签,而他们的id刚好为attributes,所以程序中的el.attributes刚好把两个input标签拿到了,变成一个数组[0:input#attributes,1:intup#attributes]

然后attr拿出了数组中的第一个元素:input#attributes ,但此时input#attributes中的name为" ",所以下面的代码就不会移除name

然后再拿出数组中第二个元素,name也为空

当循环完成后,程序又走进input标签中,此时input的name会被程序过滤掉

所以最后的结果就变为

<style>@keyframes x{}</style><form style="animation-name: x" onanimationstart="alert(1)"><input><input>

可以看到我们的恶意代码并没有被过滤掉,弹窗成功!


http://www.ppmy.cn/embedded/97008.html

相关文章

使用树莓派Raspberry Pi 4和OpenWrt构建Web界面的嵌入式路由器:全面技术栈解析(代码示例)

一、项目概述 在现代网络环境中&#xff0c;嵌入式路由器作为网络连接的核心设备&#xff0c;承担着数据传输、网络安全及设备管理等重要功能。本项目旨在开发一款带有Web界面的嵌入式路由器&#xff0c;使用Raspberry Pi 4作为硬件平台&#xff0c;运行定制的OpenWrt系统。通…

每日一问:Kafka消息丢失与堆积问题分析与解决方案

Kafka消息丢失与堆积问题分析与解决方案 Kafka作为分布式消息系统&#xff0c;广泛应用于实时数据流处理、大数据分析等领域。然而&#xff0c;在实际应用中&#xff0c;Kafka可能会面临消息丢失和消息堆积的问题&#xff0c;这些问题如果得不到有效处理&#xff0c;会严重影响…

政务大数据解决方案(二)

政务大数据解决方案通过整合各类政府数据资源&#xff0c;运用数据挖掘与分析技术&#xff0c;实现对公共服务和政策决策的智能化支持。该方案包括数据的全面采集与清洗、实时存储与管理、深度分析与预测以及结果的可视化展示&#xff0c;目的是通过建立一个高效的政府数据平台…

【51单片机】让AI识别电路图,帮你进行编码(以51单片机为例)

让AI识别电路图,帮你进行编码&#xff08;以51单片机为例&#xff09; ​ 这里使用的AI大模型使用的是 Copilot。&#xff08;两个前提&#xff1a;1. 科学上网、2. 有微软账号&#xff09; 今天测试了一下Copilot识别图片的能力&#xff0c;能力还是可圈可点的。 首先准备一…

在Unreal Engine中使用C++创建基础角色并添加移动功能

目录 引言 步骤一&#xff1a;创建C类 步骤二&#xff1a;编写C代码 步骤三&#xff1a;设置输入绑定 步骤四&#xff1a;在UE编辑器中测试 结论 引言 Unreal Engine&#xff08;UE&#xff09;以其强大的功能和灵活性在游戏开发界广受好评。本文将指导你如何在UE中通过…

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器&#xff08;重点&#xff09; 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡&#xff08;重点&#xff09;

ISIS中间系统到中间系统

1.IS-IS概述 中间系统到中间系统路由协议、数据链路层协议(Eth:Type:0x8000)&#xff0c;安全性高。 设计于OSI/RM&#xff0c;后续对TCP/IP进行兼容性改进&#xff0c;成为集成式IS-IS。收敛速度快、扁平化部署、兼容性及可扩展性强、适用于运营商(骨干)网络。无类路由协议、…

Spring Boot Controller 最佳实践

随着微服务架构的普及&#xff0c;RESTful API已经成为现代Web服务的标准设计模式。Spring Boot为开发者提供了强大的工具来快速构建RESTful服务。本文将探讨如何利用Spring Boot的最佳实践来设计高效且一致的控制器。 1. RESTful接口地址的定义规则 RESTful API设计的核心在…