xss-domcobble绕过XSSfilter

news2025/1/15 13:07:01

目录

DOM破坏的原理

例题

多层标签

HTMLCollection

一些常见的标签的关系

三层标签如何获取

例题


DOM破坏的原理

DOMClobber是一种攻击技术,它利用了DOM(文档对象模型)的特性来破坏或修改网页的结构和功能。

DOMClobber攻击通常发生在Web应用程序中,其中攻击者能够注入恶意代码或修改网页的DOM结构。DOMClobber攻击的目标是修改网页中的关键元素,例如修改表单的提交目标、修改链接的目标URL等。

攻击者可以通过修改网页的DOM结构来欺骗用户或实施其他恶意行为。例如,攻击者可以修改网页中的表单目标,使用户的输入数据被发送到攻击者控制的服务器,从而窃取用户的敏感信息。攻击者还可以修改网页中的链接,使用户被重定向到恶意网站。

为了防止DOMClobber攻击,开发人员应该对用户输入进行充分的过滤和验证,并使用安全的编码方式来处理和显示用户输入。此外,开发人员还应该使用安全的DOM操作方法,避免使用直接的innerHTML或eval等危险的操作。

我们来举一个例子

打印出来如下

通过打印<img>标签中的id或者name属性值,我们获取到了整个<img>标签,从中我们也发现了规律,直接打印x,y不管是id还是name都可以打印出来,而通过document来获取x,y只能打印出name属性的标签,window和直接打印的结果是一样的,都可以打印。

再看下面的例子

下面这个例子可以看到cookie开始是空值,然后创建了一个div元素,在div里面添加了<img name=cookie>标签,然后添加到body里面去,这时候再打印cookie,发现变成了<img name="cookie">,这个例子成功地让本来为空值的cookie有了值,而且是我们可以控制的。

然而得到一个标签对象并不是我们想要的,有些函数的参数并不是一个对象,而是字符串这就需要函数在调用自己时,自己本身有一个ToString函数能够转换为字符串,然后让函数执行,所以我们需要一个自身拥有ToString函数的标签,而不是继承父类Object的ToString函数

可以看到一个对象调用父类的toString函数就会返回[object object],所以我们需要一个本身有toString函数的标签,通过下面的脚本过滤出了自身拥有toString函数的标签,HTMLAreaElement()和HTMLAnchorElement(),也就是<textarea>和<a>标签,所以这两个标签我们可以利用。

所以我们可以通过以下代码来进⾏fuzz 得到可以通过toString ⽅法将其转换成字符串类型的标签

Object.getOwnPropertyNames(window)
.filter(p => p.match(/Element$/))
.map(p => window[p])
.filter(p => p && p.prototype && p.prototype.toString 
!== Object.prototype.toString)

例题

这道题通过get参数将内容写入h2标签内,而且有过滤框架DOMPurify,这个过滤框架由安全团队cure53开发,以我们的技术很难绕过,但是注意setTimeout函数内的ok参数,这里的JS代码是没有任何关于ok参数的定义的,所以我们可以使用DOM破坏。XSS Game - Ok, Boomer | PwnFunction

构造ok参数,因为setTimeout函数执行字符串,所以需要用到<a>或者<textarea>标签

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

因为DOMPurify框架过滤了javascript,所以我们用tel,tel也可以执行script脚本

多层标签

如果我们需要获取一个标签下的子标签的内容,怎么获取呢?可以直接x.y吗?

很可惜,无法获取。

HTMLCollection

上述结果中,让我们值得注意的是我们可以通过 collection[name] 的形式来调⽤其中的元素,所以我们似乎可以通 ,过先构建⼀个HTMLCollection ,再通过 collection[name] 的形式来调⽤。
<div id = "x" >
<a id = "x" name = y href = "1:hasaki" ></a>
</div>
此时x指代了一个集合,既有div也有a标签,然后再获取它的y属性。

一些常见的标签的关系

form->button  form->fieldset  form->image  form->img   form->input  form->object            form->output

三层标签如何获取

那么三层标签又该如何处理呢?

如果有三层标签,就需要要⽤到以上两种技巧来构建了,先分析x.y,x是一个集合,然后获取y,利用了第一种方法--集合方式,获取了第一个form标签然后x.y.z,因为form和output标签存在关系,可以直接调用y.z,利用了第二种方法--标签关系最后x.y.z.value就成功拿到output标签内的内容。


这个先⽤⼀个HTMLCollection 获取第⼆级,再在第⼀个表单中⽤output 标签。

例题2

以下是他的js代码。


const data = decodeURIComponent(location.hash.substr(1));
const root = document.createElement('div');
//data为URL后的hash值,然后创建了一个div标签,把我们输入的hash值放进了div这个标签里面.
root.innerHTML = data;
 
// 这里模拟了XSS过滤的过程,方法是移除所有属性
for (let el of root.querySelectorAll('*')) {
    let attrs = [];//第一个for循环拿出了div元素的所有后代元素,用el表示,并且定义了一个空数组attrs.
    for (let attr of el.attributes) {
        attrs.push(attr.name);//第二个for循环拿出了后代元素的所有属性,用attr表示,然后将属性添加到attrs数组里.
    }
    for (let name of attrs) {
        el.removeAttribute(name);
    }//第三个for循环拿出了attrs数组里面的属性,用name表示,然后移除掉这个元素的该属性.
}
 
document.body.appendChild(root); //最后将div添加到body里面去.
我们可以直接看下面这个例子
你的img的所有值被删除,这就是上述js代码的功能,移除掉我们输入标签的所有属性。如果还不理解可以进行断点调试。
我们最主要的想法就是让el.attributes不要去实现他原有的功能,而是被我们的自定义代码所取代。
那么我们来看一下playload
 <style>@keyframes x{}</style><form style="animation-name:x" onanimationstart="alert(1)"><input id=attributes><input id=attributes></form>

这段代码的主要作用是创建一个带有两个输入字段的表单,并在表单元素的动画开始时触发一个警告框,但实际上由于CSS动画为空,所以没有实际的动画效果,即表单元素的动画开始时,将触发alert(1)。

这是chatgpt对于这段代码的解读,我们这样写就是用来破坏el.attributes属性的,而上文我们的标签关系中有form和input这个关系属性的,可以直接调用x.y,所以代码中的el.attributes正好是我们的input标签,那为什么不用一个input标签,而是两个呢?

因为在for循环中el.attributes需要是可迭代的,而一个input标签只是一个对象,所以是不可迭代的

报错如下

所以我们需要两个input标签来组成一个集合,这时,集合就是可迭代的了根据代码,首先到style标签,没有属性可删,然后到form标签因为迭代对象变成了input标签集合,此时attr就变成了undefined,所以attr.name也就不存在,此时attrs数组获取不到form标签里的任何属性,自然下面的for循环也不会删除form表单的任何属性。

最后到我们的两个input标签,因为此时目的已经达到,删除了属性也无妨,最后成功绕过。

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

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

相关文章

NoSQL之redis高可用(主从复制、哨兵、集群)搭建

目录 一、redis集群的三种模式 1、主从复制 2、哨兵 3、集群 二、Redis的主从复制 1、主从复制的作用 2、主从复制流程 3、搭建Redis 主从复制 实验环境&#xff1a; 3.1 安装 Redis 3.2 修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 3.3 配置两台…

YOLO目标检测——交通标志数据集+已标注voc和yolo格式标签下载分享

实际项目应用&#xff1a;交通安全监控、智能交通系统、自动驾驶和辅助驾驶、驾驶员辅助系统、交通规划和城市规划等等。数据集说明&#xff1a;YOLO交通标志检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;分为…

【LeetCode-简单题】367. 有效的完全平方数

文章目录 题目方法一&#xff1a;二分查找 题目 方法一&#xff1a;二分查找 找 1 - num 之间的 mid&#xff0c; 开方是整数 就找得到 mid&#xff0c; 不是整数自然找不到mid class Solution { // 二分查找 &#xff1b;找 1 - num 之间的mid 开方是整数 就找得到 不是…

pandas入门

Pandas 是在 Numpy 上的封装。 继承了 Numpy 的所有优点&#xff0c;但是这种封装有好有坏 我们对比一下两者创建的形式和效果 import pandas as pd import numpy as np anp.array([[1,2],[3,4]]) bpd.DataFrame({"a":[1,2],"b":[3,4]} ) print(a,"\…

IP175D参考资料和引脚图

特性 宽工作温度范围IP175DLF(0C至70C) IP175DLFI (-40C至85C)内置6个MAC和5个PHY 每个端口可配置为10base-t、100Base-TX 最多2K个MAC地址 支持自极性10Mbps 广播风暴防护 汽车MDI-MDIX 支持3个MIL/RMII接口Layer2-4多字段分类器支持8-MultiField输入支持交通政策支持…

【LeetCode-简单题】844. 比较含退格的字符串

文章目录 题目方法一&#xff1a;单指针方法二&#xff1a;双指针方法三&#xff1a;栈 题目 方法一&#xff1a;单指针 首先每次进入循环处理之前需要对第一个字符进行判断&#xff0c;若是退格符&#xff0c;直接删掉&#xff0c;结束此次循环fast从0开始&#xff0c;如果fa…

【Redis】Redis 的学习教程(八)之 BitMap、Geo、HyperLogLog

Redis 除了五种常见数据类型&#xff1a;String、List、Hash、Set、ZSet&#xff0c;还有一些不常用的数据类型&#xff0c;如&#xff1a;BitMap、Geo、HyperLogLog 等等&#xff0c;它们在各自的领域为大数据量的统计 1. BitMap BitMap 计算&#xff0c;可以应用于任何大数…

DVWA XSS 通关挑战

文章目录 XSS漏洞概述反射性lowMediumhigh 存储型lowMediumhigh XSS漏洞概述 ​ 跨站点脚本(Cross Site Scripting,XSS)是指客户端代码注入攻击&#xff0c;攻击者可以在合法网站或Web应用程序中执行恶意脚本。当wb应用程序在其生成的输出中使用未经验证或未编码的用户输入时&…

30 | 工欲善其事必先利其器:后端性能测试工具原理与行业常用工具简介

对性能测试的理解和认识&#xff1a; 后端性能测试和后端性能测试工具之间的关系是什么&#xff1f; 后端性能测试工具和 GUI 自动化测试工具最大的区别是什么&#xff1f; 后端性能测试工具的原理是什么&#xff1f; 后端性能测试中&#xff0c;性能测试…

@JsonDeserialize和@JsonSerialize注解的使用

JsonDeserialize注解介绍 JsonDeserialize&#xff1a;json反序列化注解&#xff0c;作用于setter()方法&#xff0c;将json数据反序列化为java对象。可以理解为用在处理接收的数据上。 使用场景 前端传递的参数与后端实际接收的参数不一致时&#xff0c;可以通过反序列化注…

innovus: 如何只place不优化?

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球 一些ip从模拟转用数字去做&#xff0c;只需要place即可&#xff0c;不需要做任何优化&#xff0c;通常面积都很小&#xff0c;但std cell手摆太累了&#xff0c;工具提供如下命令&a…

Chrome 基于 Wappalyzer 查看网站所用的前端技术栈

1. 找到谷歌商店 https://chrome.google.com/webstore/search/wappalyzer?utm_sourceext_app_menu 2. 搜索 Wappalyzer 3. 添加至Chrome 4. 使用 插件 比如打开 https://www.bilibili.com/ 就可以看到其所以用的前端技术栈了

软件测试下的AI之路(2)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

打工人必装的5款黑科技软件,办公舒适度立刻提升数倍

分享打工人必装的5款黑科技软件&#xff0c;让你高效完成工作&#xff0c;办公舒适度立刻提升数倍。 DroidCam——手机充当电脑摄像头 DroidCam可以让你的手机充当电脑的摄像头&#xff0c;让手机拍摄到的画面实时投送到电脑屏幕上&#xff0c;也可以充当视频聊天的摄像头&…

55、基于 WebFlux 开发 WebSocKet

★ 基于Web Flux开发WebSocket 两步&#xff1a; &#xff08;1&#xff09;实现WebSocketHandler开发WebSocket处理类。 实现该接口时只需要实现Mono handle(WebSocketSession webSocketSession)方法即可。 &#xff08;2&#xff09;使用HandlerMapping和WebSocketHandler…

TypeScript:赋予JavaScript数据类型新的力量,提升编程效率!

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ &#x1f4da; 前言 TypeScript&#xff1a;扩展JavaScript数据类型&#xff0c;赋予编程更强大的表达能力&#xff01…

bs4库爬取小说工具

学习了爬取天气预报&#xff0c;今天尝试做个爬取小说工具&#xff0c;有时候网上看看小说休闲下&#xff0c;打算保存txt文本文件&#xff0c;方便离线阅读。 第一步&#xff1a;先确定目标网址 网上随便找了本小说&#xff0c;先找到小说目录页面。 网址首页&#xff1a;h…

c语言练习48:总结字符函数和字符串函数

总结字符函数和字符串函数 字符函数 1. 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h 2. 字符转换函数 字符串函数 . strlen的使⽤ •字符串以 \0 作为结束标…

Linux操作系统基础知识

目录 一、什么是Linux 二、如何有一个Linux环境 三、基本的 Linux 命令 1. pwd - 显示当前工作目录 2. ls - 列出文件和目录 3. cd - 切换目录 4. mkdir - 创建目录 5. rm - 删除文件或目录 6. cp - 复制文件或目录 7. mv - 移动文件或目录 8. touch - 创建空文件 9…

智能座舱概述

文章目录 智能座舱智能驾驶一、汽车座舱历经机械化、电子化&#xff0c;向智能化不断演进二、智能座舱的定义&#xff1a;车内升级车外互联1.从车内看2.从车外看 三、电子座舱、智能助理、人机共驾、第三生活空间 智能座舱智能驾驶 智能汽车以“座舱”“底盘”上下两大智能化系…