xss-domcobble绕过XSSfilter

2023-10-26

目录

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标签,因为此时目的已经达到,删除了属性也无妨,最后成功绕过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xss-domcobble绕过XSSfilter 的相关文章

  • 每天10个前端小知识 <Day 7>

    前端面试基础知识题 1 什么是尾调用优化和尾递归 尾调用的概念非常简单 一句话就能说清楚 就是指某个函数的最后一步是调用另一个函数 function f x return g x 上面代码中 函数f的最后一步是调用函数g 这就叫尾调用 尾调
  • 每天10个前端小知识 <Day 5>

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • 基于java的web仓库管理系统设计与实现

    基于java的web仓库管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的Web仓库管理系统是近年来快速发展的领域之一 它提供了丰富的功能 如数据存储 数据检索 数据分析和数据可视化等 本文将重点介绍基于Java的Web仓库管
  • 低代码配置-组件列表设计

    过滤字段功能 配置了api 启用 输出配置 filter type Array default gt
  • 低代码配置-列表页组件设计

    保存 表单属性存放 bill 筛选项配置存放 filterLayout 列表按钮存放 buttonLayout 列表布局存放 listLayout api存放 api 数据结构 layout 存放表单基础配置 bill 存放按钮基础配置 b
  • 低代码配置-属性配置面板设计

    模块设计 tab项切换 组件基础属性 组件数据属性 组件事件属性 表单属性 模块输出函数设计 tab切换函数 列表表单属性 数据来源 调用接口时一次赋予 无需使用selectItem 如需使用 归入基础属性 列表标题 是否展示筛选区域
  • chrome浏览器无法在地址栏输入内容搜索问题解决--图文

    关于日常遇到的小问题解决记录一下 1 导航栏录入信息后跳转错误 2 解决办法 默认百度搜索引擎地址错误 百度正确的搜索格式是 http www baidu com s wd s chrome浏览器中百度的搜索格式是 http www bai
  • addslashes() 可以安全地防止 HTML 属性中的 XSS 吗?

    我不得不开发一个以前的开发人员留下的旧网络应用程序 它使用addslashes 来防止HTML属性上的XSS 这是一个例子 这是否容易受到 XSS 攻击 有没有什么方法可以让 javascript 在 value 属性中运行 就像在 src
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 如何在 Python 脚本中使用 Google OAuth2

    在使用 Python 脚本将视频上传到 YouTube 频道时 若希望将视频上传到第二个频道 需要解决 OAuth2 授权的问题 解决方案 创建新的 Google Cloud 项目 from google oauth2 import ser
  • 是否可以检测弹窗中的用户点击事件?

    如果当前 url 和弹出 url 位于同一域中 我可以使用以下代码检测弹出窗口中的用户单击事件 var myWindow window open abc html MsgWindow width 500 height 600 myWindo
  • 如何使用 AntiXss 库正确清理内容?

    我有一个简单的论坛应用程序 当有人发布任何内容时 我会 post Content Sanitizer GetSafeHtml post Content 现在 我不确定我是否做错了什么 或者发生了什么 但它不允许几乎没有 html 甚至简单
  • 在没有脚本标签的情况下执行 XSS JavaScript

    我正在学习 XSS 出于道德目的 我想知道如何在不使用
  • HTTP 标头中 CRLF 序列的不正确中和

    我在我的项目上运行了 Veracode 扫描 它在 HTTP 响应拆分下给了我 CWE ID 113 问题 我尝试根据建议解决该问题 但没有成功 例如 try String selNhid req getParameter selNhid
  • HTMLPurifier 破坏图像

    我试图根据 WYSIWYG CK 编辑器 的用户输入运行 HTMLPurifier 但图像损坏 未过滤的输入 img alt laugh src lib ckeditor plugins smiley images teeth smile
  • 如何使用 Struts 预防 XSS 漏洞

    我们需要在 Struts 应用程序中添加反 XSS 支持 最具体地说 架构师要求所有用户输入在存储到数据库之前必须进行 清理 由于我不想重新发明方轮 我可以使用哪个 Java 库来实现此目的 以及把它放在哪里 理想情况下 它应该是可配置的
  • 如何修复java中反映的XSS

    我收到了强化报告 其中显示了来自下面第二行的 XSS 反射缺陷 String name request getParameter name response getWriter write 姓名 姓名 给出的建议 向 Web 客户端显示的所
  • html() 与 innerHTML jquery/javascript 和 XSS 攻击

    我正在对我自己的代码测试 xss 攻击 下面的示例是一个简单的框 用户可以在其中输入他想要的任何内容 按 测试 后按钮 JS 会将输入字符串显示为两个 div 这是我为了更好地解释我的问题而制作的示例
  • GWT SafeHTML、XSS 和最佳实践

    OWASP 的优秀人员强调 您必须对 HTML 文档中要放入不受信任数据的部分 正文 属性 JavaScript CSS 或 URL 使用转义语法 看OWASP XSS https www owasp org index php XSS 2

随机推荐

  • null,default关键字

    一 null关键字 1 null是空的意思 在表中 默认情况下 所有的字段值都可以为空 1 建表期间 可以对某一字段进行非空约束 not null 在insert时 此字段必须要有数据 create table temo id number
  • libuv之基础

    TCP客户端连接步骤 连接方法 Uv loop t loop uv default loop uv tcp t client malloc uv connect t connect req malloc uv tcp init loop c
  • C++ 仿函数(一)

    目录 一 仿函数是什么 二 仿函数的特点 1 仿函数在使用时 可以像普通函数那样调用 可以有参数 可以有返回值 2 仿函数超出普通函数的概念 可以有自己的状态 编辑3 仿函数可以作为参数传递 三 谓词 一元谓词示例 二元谓词示例 总结 一
  • 银行股的分红是不是比利率要高,投十万银行股一年分红有多少啊?

    工农交建中目前股息均超5 以上 10万元投资银行股 一年分红收益能达到5500左右 银行一年定期存款1 5 10万存款年利息1500 买银行股比存银行一年多收益4000左右
  • dell服务器重装win10,戴尔dell重装win10系统后无法引导的解决方法(原创)

    戴尔新机型都采用 Intel 酷睿第八代以上处理器 戴尔8代以上cpu都不支持传统模式了 默认预装了win10系统不是很好用 想重新安装win10 但是预装win10的机型默认是UEFI引导 但戴尔电脑装win10后出现不能引导情况 一般出
  • OpenFeign配合logback链路追踪

    创建MDC上下文 public class MdcContext MDC上下文 存储tId private static final ThreadLocal
  • 多线程(十)多线程编程示例

    文章目录 一 交替输出1A2B3C4D5E 1 1 synchronized wait notify 1 2 Condition await signal 二 生产者 消费者问题 2 1 synchronized wait notify 2
  • java final关键字修饰局部变量,final关键字的这8个小细节,你get到几个?

    今天来聊 final 关键字 因为最近在看的几本书都讲到了 final 关键字 发现好多小细节自己都忽视了 抽空总结了一下 分享给大家 正文 final关键字是一个常用的关键字 可以修饰变量 方法 类 用来表示它修饰的类 方法和变量不可改变
  • 数据在底层的存储模式

    1 数据的存储模式 大端存储模式 常见于我们的手机等 低地址放高数据 小端存储模式 比如PC 低地址存放低数据 面试题 设计程序判断大小端 这里可以有两种方式 1 写一个函数通过数据类型 int main int a 0x11223344
  • 我的服务器开发之路-安装mysql之mariadb并更改数据库路径

    centos最好安装mariadb 输入rpm qa grep mariadb 并没有显示版本号 则说明并没有安装mariadb 输入yum remove mysql mysql server mysql libs可完全卸载mysql相关
  • K8S个人学习之路

    服务器预备环境 1 永久禁用swap空间 1 临时关闭swap分区 重启失效 swapoff a 2 永久关闭swap分区 sed ri s swap etc fstab 2 修改k8s gcr io 路径的镜像 其他的镜像仓库 MY RE
  • Spark-RDD编程

    Spark在进行计算的时候通常会包含以下几个步骤 创建SparkContext上下文对象 使用SparkContext加载数据创建RDD RDD的转换算子transfotmations RDD的行动算子actions RDD的缓存和持久化
  • 反射获取字段的值与非空校验

    获取指定字段的值 通过字段对应的get方法 public Object getFieldValueByName1 String fieldName Object obj try String firstLetter fieldName su
  • 《Semi-Supervised Semantic Segmentation with Cross-Consistency Training》 2020CVPR 论文阅读

    在这项工作中 作者首先观察到 对于语义分割 低密度区域在隐藏表示中比在输入中更明显 作者提出了交叉一致性训练 其中预测的不变性是施加不同的扰动在编码器输出上 Cross Consistency Training 该模型包含一个共享的enco
  • SQL千万级大数据量查询优化

    转发自 https blog csdn net long690276759 article details 79571421 spm 1001 2014 3001 5506 防止查询资料找不到来源 很详细 1 对查询进行优化 应尽量避免全表
  • c++中istringstream及ostringstream超详细说明

    文章目录 1 stringbuf类介绍 1 1 stringbuf类构造函数 1 2 str函数 2 istringstream类 2 1 rdbuf函数 2 2 swap函数 3 ostringstream类和stringstream类
  • whisper

    Robust Speech Recognition via Large Scale Weak Supervision 介绍 大规模弱监督的训练 先前的方法都是通过大量的无监督学习训练 无监督的数据容易收集 所以通过大量无监督的学习可以训练出
  • Node中的事件循环

    Node中的事件循环 Node的底层语言是libuv 使用v8引擎解析js脚本 libuv负责调用接口API 将不同的任务交给不同的线程处理 再将处理结果交给v8引擎 v8引擎再将处理结果发送给用户 Node中任务的执行顺序 timers定
  • Mybatis-Plus:Service接口

    目录 IService接口 1 写实体类 2 写mapper接口 3 写service接口 4 写service接口的实现类 IService自带方法 1 save 2 SaveOrUpdate 3 Remove 4 Update 5 Ge
  • xss-domcobble绕过XSSfilter

    目录 DOM破坏的原理 例题 多层标签 HTMLCollection 一些常见的标签的关系 三层标签如何获取 例题 DOM破坏的原理 DOMClobber是一种攻击技术 它利用了DOM 文档对象模型 的特性来破坏或修改网页的结构和功能 DO