XSS---DOM破坏靶场复现

news2024/9/27 17:14:01

目录

一、OK,Boomer

一、网址:

 二、源码分析:

三、 解决思路:

1.页面中的元素可以通过id和name直接取出来

2.覆盖

3.覆盖方法

四、ToString

五、setTimeout函数

六、使用框架白名单 

七、成功绕过 

​编辑 二、案例分析

  一、源码分析:​编辑

二、属性未全部移除

三、原因

四、成功绕过

 五、修复

六、解决方法:


一、OK,Boomer

一、网址:

XSS Game - Learning XSS Made Simple! | Created by PwnFunction

 二、源码分析:

<!-- Challenge -->
<h2 id="boomer">Ok, Boomer.</h2>
<script>
    boomer.innerHTML = DOMPurify.sanitize(new URL(location).searchParams.get('boomer') || "Ok, Boomer")
    setTimeout(ok, 2000)
</script>

 通过源码分析,用户可控参数为boomer,那我们首先试着在该参数上使用img标签

?boomer=<img%20src=1%20οnerrοr="alert(1)">

 但是没有任何反应,通过F12查看,发现img标签里面只有“src=1”,οnerrοr=”alert(1)”被丢弃了,原因是存在DOMPurify.sanitize过滤框架,并且该框架绕过几率几乎很小。

setTimeout(ok, 2000)---定时器,正常情况下 2秒后执行一个ok,但在这里执行不了,没有这个ok,执行了一个完全不存在的。

三、 解决思路:

1.页面中的元素可以通过id和name直接取出来

 Document.cookie

<img name=”cookie”>

本来是想通过Document.cookie取出cookie,但是却取出来了一个标签

说明:页面中的元素可以通过id和name直接取出来

2.覆盖

  1. 首先使用Document.cookie取出cookie,但这里没有cookie所以没取到。
  2. 创建div元素,并在div元素中写入<img name=cookie>
  3. 将div元素插入到body中去
  4. 重新获取cookie,发现取出的是img标签

可以看到Document.cookie已经被我们用img标签覆盖了

3.覆盖方法

 实际上Document.body取到的是<img id=”appendChild”>,说明我们通过多层覆盖掉了Document.body.appendChild方法。

 既然我们可以通过这种⽅式去创建或者覆盖 document 或者 window 对象的某些值,但是看起来我们 举的例⼦只是利⽤标签创建或者覆盖最终得到的也是标签,是⼀个HTMLElment 对象。

但是对于⼤多数情况来说,我们可能更需要将其转换为⼀个可控的字符串类型,以便我们进⾏操作。 

四、ToString

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

Object.getOwnPropertyNames(window) // 拿到window下面所有属性名称

.filter(p => p.match(/Element$/)) //过滤,只要后缀为Element的

.map(p => window[p]) //取值,map一个一个的取

.filter(p => p && p.prototype && p.prototype.toString

 !== Object.prototype.toString)//必须具有自身prototype属性,并且自身具有tostring方法,并且不是继承object的

我们可以得到两种标签对象:HTMLAreaElement (<area>) & HTMLAnchorElement (<a>),这两个 标签对象我们都可以利⽤href 属性来进⾏字符串转换

五、setTimeout函数

 

可以吧函数当字符串放进去,那么就可以用a标签来解决

?Boomer=<a id=ok href=”javascript:alert(1)”>

 

六、使用框架白名单 

但是同样没有任何反应,原因是还是没有绕过这个框架,javascript对于这个框架是一个黑名单,所以使用框架里面的白名单即可。 

七、成功绕过 

 二、案例分析

  一、源码分析:

将data插到div里, 获取div里面的子函数,拿到标签里面的所有属性,然后将属性进行移除。

二、属性未全部移除

但是并没有将所有属性移除,为什么会出现这种情况

三、原因

这是因为它的属性移除是在同一个数组上操作的,假如这个数组里有a、b、c三个 属性,当将a删除后,指针会往下走一步,但是由于第一位的a被删除,那么b会往上移一位,所以b不会被删除。

四、成功绕过

那么想绕过这个过滤就很简单了,将paylod写在第二位或者第四位上就能成功绕过。

 五、修复

 现在上面的做法就不能实现了。

六、解决方法:

1.dom破坏

2.在删除之前就执行

<svg><svg οnlοad=alert(1)>

在删除之前就执行 

 SVG标签能成功的原因:

1.嵌套的 SVG 标签:虽然代码试图删除所有元素的属性,但 SVG 标签的嵌套特性让它有机会绕过。举个例子,<svg><svg onload=alert(1)>,在解析时,第一个 <svg> 会被当作一个普通的 SVG 元素,而内层的 <svg onload=alert(1)> 也会被当作一个有效的 SVG 元素。外层的 SVG 即使属性被移除,但内层的 SVG 仍然存在,并且 onload 属性会触发。

2.过滤方法的局限性:代码通过遍历所有元素并删除其属性来达到过滤目的,但对于某些元素的嵌套结构,它无法完全处理。例如,即使外层的 SVG 标签属性被删除,内部的 SVG 标签仍然能够被解析并执行。

3.解析顺序问题:浏览器在解析 HTML 时,会先生成 DOM 树,然后再应用 JavaScript 来操作 DOM。即使 JavaScript 在之后移除了属性,浏览器在初次解析时已经触发了嵌套的 SVG 标签的 onload 事件。

单一的 <svg> 标签因为缺少执行代码的属性而不会触发 XSS。然而,嵌套结构中,内层的 <svg> 标签仍可能包含恶意代码或事件处理程序,并绕过简单的属性移除过滤逻辑。

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

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

相关文章

才来鱼厂实习 1 个月,就转正了!

大家好&#xff0c;我是程序员鱼皮。昨天&#xff0c;我给才来我们公司 实习一个月 的前端开发同学转正了&#xff0c;直接发了正式 Offer&#xff01;这个转正速度&#xff0c;放眼到所有公司中&#xff0c;我相信也是炸裂的。 看小伙子那么激动&#xff0c;让我回想到了 19 年…

认识 bufferbloat

很多人并不理解 bufferbloat 的本质&#xff0c;我引用《计算机网络-自顶向下方法(第 8 版)》第四章的一个解释&#xff1a; 很形象的比喻&#xff0c;buffer 就像盐&#xff0c;不可或缺&#xff0c;适量增味&#xff0c;过量食物就不能吃了。高血压患者更有所感受&#xff…

STM32是基于ARM架构的,那么ARM究竟是什么呢?

一、什么是ARM 首先&#xff0c;ARM是一家英国公司&#xff0c;全称Advanced RISC Machines&#xff0c;高级精简指令集机器&#xff0c;RISC意味着是精简指令集的芯片。同时也有复杂指令集CSIC的芯片&#xff0c;如X86&#xff0c;常以Intel和AMD为主。 其次&#xff0c;之后…

如何跳过极狐GitLab 密钥推送保护功能?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

vue 子组件全局自动导入,不在需要每个组件import

main.js import vue from vue import App from ./App.vue import axios from axios axios.defaults.baseURL HTTP://LOCALHOST:3000/api/ Vue.prototype.$http axios; vue config.productionTip false; //子组件全局自动导入 const requireComponents require.cont…

MK米客方德推出新一代工业级SD NAND——更长寿命、更高速度、更优功耗

博客目录 关注我&#xff0c;不迷路&#xff0c;共学习&#xff0c;同进步一、产品封装与兼容性二、SLC 存储颗粒的使用三、高性能 IOPS 表现四、智能健康监测功能五、内嵌 ECC 校验、坏块管理和其他保护机制六、低功耗设计总结 作为 SD NAND 领域的领跑者&#xff0c;MK 米客方…

【Chromium】分享一个网址 Chromium Browser Snapshots

利用 Chromium Browser Snapshots 进行开发和调试 author: jwensh & chatgpt date:20240819 文章目录 利用 Chromium Browser Snapshots 进行开发和调试1. 获取最新的浏览器特性2. 测试和调试浏览器兼容性问题3. 开发和测试浏览器扩展4. 安全研究和漏洞分析5. 提前为新特性…

如何一键删除iPhone相册所有照片

拍照已成为我们记录日常生活的常态。但是&#xff0c;大量照片便会积累在设备上&#xff0c;这不仅占用了大量存储空间&#xff0c;而且随着时间的推移&#xff0c;管理这些照片也变得越来越困难。如果你决定清理旧照片&#xff0c;或者出于隐私考虑需要删除所有照片&#xff0…

2024:AI新纪元,轻松打造你的专属AI助手

引入 在数字化时代的潮流中&#xff0c;人工智能已经成为了我们生活中不可或缺的一部分。2024年被誉为“AI元年”&#xff0c;这不仅是因为人工智能技术的飞速发展&#xff0c;更是因为它已经渗透到我们的日常生活中&#xff0c;为我们带来了无数便利和可能性。在这个充满活力…

FPGA使用笔记:GPIO操作方式(用于测试设备io驱动性能)

一、前言 使用FPGA测试IO速率&#xff0c;用于后续驱动高速AD/DA等高速芯片做铺垫&#xff0c;很多芯片的驱动都是使用并行接口&#xff0c;不是使用专用接口的&#xff0c;这样采样速率的快慢就有CPU的时许周期决定了。 本文测试FPGA和STM32&#xff0c;后续如果用到更快的芯…

探索大模型时代:全面解析Agent智能体的奥秘

前言&#xff1a; 在2024年&#xff0c;大模型圈子的Agent是一个绝对热门的话题&#xff0c;agent也被各种各样的公众人物所追捧 Agent智能体能够最大化的激发大模型潜能还有人说agent智能体式大模型时代的APP&#xff0c;也有人说agent是在toB场景落地的主要方式之一 无论任…

信创(国产化)方案

信创 信创&#xff0c;即信息技术应用创新&#xff0c;旨在实现信息技术自主可控 openEuler openEuler是一款开源、免费的操作系统&#xff0c;由openEuler社区运作&#xff0c;前身为运行在华为公司通用服务器上的操作系统EulerOS。openEuler作为一款开源、免费的操作系统&…

QT6.0如何开启白名单保活

1. 概述 使用Qt开发android应用往往会存在这样一个问题:我们的android应用和后台需要时刻保持通信,但是往往我们在切换任务或者息屏,将我们开发的应用变更为后台应用的时候,由于android的电池策略,会将后台的应用关闭掉从而释放资源供其他应用使用.会给应用带来不好的使用…

Dubbo从入门到应用:实战技巧和最佳实践

远程调用 一、Dubbo快速上手提供者DubboService 调用者DubboReference 开启Dubbo调用EnableDubbo 二、Dubbo快速入门1、添加 Dubbo 相关的 maven 依赖。2、定义服务接口3、 定义服务端的实现4、配置服务端及消费端 Yml 配置文件5、基于 Spring 配置服务端及消费端启动类6、消费…

每日学习笔记:C++ STL之堆栈容器stack

目录 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例

springboot+vue 初始

1.控制器 2.文件上传拦截器 #过滤规则 # 默认访问static下面的文件http://localhost:8009/4.jpeg&#xff0c; # 带上static-path-pattern/static/**后&#xff0c;http://localhost:8009/static/4.jpeg spring.mvc.static-path-pattern/static/**#静态资源位置 spring.web.res…

【可能是全网最丝滑的LangChain教程】二十一、LangChain进阶之Memory

人生和电影不一样&#xff0c;人生要辛苦多了。 01 Memory介绍 Memory&#xff08;记忆&#xff09;是LangChain中的一个重要组成部分&#xff0c;它允许模型在处理请求时能够访问历史对话记录或其他相关上下文信息&#xff0c;从而使得对话更加连贯和自然。 LangChain Memor…

STM32标准库学习笔记-5.定时器-输出比较

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 输出比较OC OC&#xff08;Output Compare&#xff09;输出比较输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波…

vue使用海康视频web插件如何实现自适应

如果要实现自适应的话&#xff0c;就需要在不同的分辨率内设置不同的宽度和高度&#xff0c;可以监听当前屏幕的宽度和高度(可视区域的宽高)&#xff0c;划分不同的显示阶段 通过设置父级元素的宽度和高度实现子级视频的自适应 index.vue <template><div class&quo…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…