XSS-DOM 2

目录

1 DOMPurify

1.1 漏洞源码

1.2 加载框架

​编辑

setTimeout

1.3 ok?

1.4 window和document

1.5 Overwrite(document.x)

1.5.1 打印cookie

1.6 Overwrite2(document.x.y)

1.6.1 form表单

1.7 toString

2. 设计目的:“重写类型转换逻辑”

3. 延伸:“类型转换” 的场景

1.8 可控字符串a标签的属性等

1.8.1 a href

逐步骤分析结果由来:

最终结果的本质:

 打印代码结果:

1.9 alert执行script

1.9.*  和alert的区别

1.10 利用DOM破坏

1.10.1 ok

1.10.2 payload:

1.10.3 setTimeout

 1.11 DOM框架过滤了JavaScript恶意代码


1 DOMPurify

1.1 漏洞源码

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

1.2 加载框架

Release DOMPurify 3.2.6 · cure53/DOMPurify · GitHub

可以去GitHub上面将此框架下载下来,加载到这个代码中,并且加载路径写到js之前执行

setTimeout

//这是一个定时器,js定时器有两个,一个是setTimeout 在指定延迟的时间内执行一次,2秒后执行ok
// setInterval 循环执行

1.3 ok?

1 ok从哪里来的,没有进行定义?

2 所以ok大概率是我们的payload恶意代码

3 框架如何过滤呢?(这个框架非常的安全基本上没有绕过的可能性)

4 ok引入

所以思考:我们该如何创建一个OK。让setTimeout执行呢?

1.4 window和document

<body><img id="x"><img name="y">
</body>
<script>console.log(x);console.log(y);console.log(document.x);console.log(document.y);console.log(window.x);console.log(window.y);

window是js所有元素的祖先

document是整个页面

访问看一下打印运行的结果

1.5 Overwrite(document.x)

1.5.1 打印cookie

自带的cookie值,网站:

最开始是没有cookie的

1.5.2 给他重新定义,写一个cookie

<body></body>
<script>let div = document.createElement('div')div.innerHTML = '<img name=cookie>'document.body.appendChild(div)console.log(document.cookie)
</script>
</html>

再次访问页面的cookie

改变了系统自带的cookie值

所以直接覆盖掉了系统函数的document.cookie

1.6 Overwrite2(document.x.y)

1.6.1 form表单

<body><form name="body"><img id="appendChild" src=1 onerror="alert(1)"></form>
</body>
<script>console.log(document.body.appendChild)
</script>

 

访问弹一,并且取代了系统函数打印出来是这个

1.7 toString

按照以上两种我们获取的都是html的标签elment元素的值,但是其实对于大多数的情况我们需要的应该是一个可控的字符串的类型

  • toString() 是什么?
    是 JavaScript 等语言中 对象的内置方法(继承自 Object.prototype),默认行为是返回类似 [object 构造函数名称] 的字符串(比如 {}.toString() 返回 [object Object][].toString() 返回 [object Array])。

  • “派生类” 指什么?
    指 继承自父类的子类(比如自定义类 class Dog extends Animal 中,Dog 就是 Animal 的派生类)。

2. 设计目的:“重写类型转换逻辑”
  • 默认逻辑的不足
    原生 Object.prototype.toString() 只反映对象的 “类型标签”(如 Object/Array),但实际开发中,我们希望对象转成字符串时 携带更具体的信息(比如 person.toString() 返回 "{name: 'Alice', age: 20}")。

  • 重写的作用
    通过在 派生类中重写 toString(),可以自定义 “对象 → 字符串” 的类型转换规则。例如:

    javascript

    class Person {constructor(name) { this.name = name; }// 重写 toString,自定义字符串转换逻辑toString() { return `Person: ${this.name}`; }
    }
    const alice = new Person('Alice');
    console.log(alice.toString()); // 输出 "Person: Alice"(而非默认的 "[object Object]")
    
3. 延伸:“类型转换” 的场景

toString() 会在以下 隐式类型转换场景 中被自动调用:

  • 拼接字符串时:console.log('Hello ' + alice)(等价于 'Hello ' + alice.toString())。
  • 使用 String() 函数转换对象:String(alice)(内部调用 alice.toString())。

因此,重写 toString() 本质是 定制对象在这些场景下的表现,属于 “类型转换逻辑” 的一部分。

简单总结:toString() 让对象能自己决定 “怎么变成字符串”,派生类重写它,就是为了让转换结果更符合业务需求

要将基本的 Object.prototype.toString() 用于重写的对象(或者在 null 或 undefined 上调用它),你需要在它上面调用 Function.prototype.call() 或者 Function.prototype.apply(),将要检查的对象作为第一个参数传递(称为 thisArg)。

1.8 可控字符串a标签的属性等

1.8.1 a href

a标签的href属性里面可以输入可控的字符串,所以我们可以利用这个来进行,来获取heref的内容

所以我们可以通过以下代码来进行 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)
逐步骤分析结果由来:
  1. Object.getOwnPropertyNames(window)
    先获取 window 对象的所有 “自有属性名”(字符串形式),包括可枚举和不可枚举属性(如各种 DOM 构造函数、全局方法等)。

  2. .filter(p => p.match(/Element$/))
    筛选出属性名 以 “Element” 结尾 的字符串。
    原因:DOM 元素的构造函数通常以此结尾(如 HTMLElementHTMLDivElementHTMLImageElementSVGElement 等)。

  3. .map(p => window[p])
    将上一步筛选出的属性名,转换为对应的 window 对象属性值 —— 即 DOM 元素构造函数本身(如 window.HTMLDivElement 对应 HTMLDivElement 构造函数)。

  4. .filter(p => p && p.prototype && p.prototype.toString !== Object.prototype.toString)
    最终筛选出满足以下条件的构造函数:

    • p 存在(排除 null/undefined);
    • p.prototype 存在(构造函数有原型对象);
    • 原型上的 toString 方法 不是 Object 原生的 toString(即该方法被重写过)。
最终结果的本质:

返回所有 “名称以 Element 结尾” 且 “原型重写了 toString 方法” 的 DOM 元素构造函数

这些构造函数对应的 DOM 元素(如 <div><img> 等),其 toString 行为已被定制(而非使用 Object 的默认实现),例如 HTMLDivElement 实例的 toString() 可能返回更具体的字符串(而非 [object Object])。

 打印代码结果:

分析知道有以下两个:

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

1.9 alert执行script

首先看一下我们的1.4的内容知道可以通过console.log(x)打印HTML标签,那么:
 <a  id="a" href="aaaa"></a>
console.log(a)

结果:

1.9.*  和alert的区别

直接alert(a),他将我们的href属性以string的形式给打印了出来

所以他用alert直接调用了a里面的tostring方法,将href里面的值打印了出来。

你将a当作函数的参数的时候,会自动调用a的tostring方法,而a的tostring是自身方法,不是继承的,他可以打印herf中的内容

1.10 利用DOM破坏

1.10.1 ok

通过以上的分析和拓展我们应该有了一个大概的思路,首先回到1.3:

1 ok可以从a标签的id来,因为通过打印a标签的id可以直接将a标签打印出来

1.10.2 payload:

2 恶意代码payload:<a id=ok href=javascript:alert(1)>

1.10.3 setTimeout

3 这是个函数,查看官方文档解释:他可以执行字符串,就是说我的ok当传入函数的参数,利用a标签自带的tostring方法将href里面的值当字符串传递给setTimeout进行执行

当输入这个恶意代码后,调试可以知道,它将JavaScript伪协议给过滤了:

 1.11 DOM框架过滤了JavaScript恶意代码

框架白名单:

 那我们思考是否可以利用白名单进行绕过呢,那白名单是否可以弹窗呢?试一下

ok,成功绕过 

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

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

相关文章

从数据丢失到动画流畅:React状态同步与远程数据加载全解析

在前端开发中&#xff0c;数据状态管理与界面同步始终是核心挑战。近期我在处理一个书签管理应用时&#xff0c;遇到了远程数据加载后无法显示、界面更新异常&#xff0c;甚至动画闪烁等一系列问题。经过多轮调试与优化&#xff0c;最终实现了数据的正确加载与流畅的界面交互。…

MySQL半同步复制机制详解:AFTER_SYNC vs AFTER_COMMIT 的优劣与选择

目录深入分析与利弊对比1. AFTER_COMMIT (不推荐)2. AFTER_SYNC (强烈推荐&#xff0c;MySQL 8.0 默认)总结与强烈建议最佳实践 MySQL 半同步复制主要有两种实现方式&#xff0c;其核心区别在于主库何时回复客户端事务提交成功&#xff08;即何时认为事务完成&#xff09;&…

GEE实战 | 4种非监督分类算法深度解析,附可直接运行的完整代码

在遥感影像处理领域&#xff0c;非监督分类凭借其无需人工标注样本的优势&#xff0c;成为快速了解地物分布的得力助手。它能自动依据像素光谱特征的相似性完成聚类&#xff0c;这种“无师自通”的特性&#xff0c;让地理空间分析变得更加高效。 今天&#xff0c;我们就来深入…

基于落霞归雁思维框架的软件需求管理实践指南

作者&#xff1a;落霞归雁 日期&#xff1a;2025-08-02 摘要 在 VUCA 时代&#xff0c;需求变更成本已占软件总成本的 40% 以上。本文将“落霞归雁”思维框架&#xff08;观察现象 → 找规律 → 应用规律 → 实践验证&#xff09;引入需求工程全生命周期&#xff0c;通过 4 个阶…

企业级AI Agent构建实践:从理论到落地的完整指南

&#x1f680; 引言 随着人工智能技术的快速发展&#xff0c;AI应用正在从简单的工具转变为智能伙伴。企业级AI Agent作为这一变革的核心载体&#xff0c;正在重新定义我们与软件系统的交互方式。本文将深入探讨如何构建一个真正意义上的企业级AI Agent系统。 &#x1f3af; …

电商项目_性能优化_限流-降级-熔断

针对电商系统&#xff0c;在遇到大流量时&#xff0c;必须要考虑如何保障系统的稳定运行&#xff0c;常用的手段&#xff1a;限流&#xff0c;降级&#xff0c;拒绝服务。 一、限流 限流算法&#xff1a;计数器、滑动窗口、漏铜算法、令牌桶算法。 限流的方案 前端限流接入…

javaweb开发之Servlet笔记

第五章 Servlet 一 Servlet简介 1.1 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源. 例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时…

sqli-labs靶场less26/a

less261.我们打开这一关来看一下&#xff0c;他提示我们空格和其他一些什么都被过滤了2.我们来尝试绕过,按照之前的做法&#xff0c;可以看到闭合方式为单引号&#xff0c;并且过滤了--与#3.我们来尝试绕过一下&#xff0c;发现可以以下的方式绕过&#xff0c;空格用&#xff0…

从Docker衔接到导入黑马商城以及前端登录显示用户或密码错误的相关总结(个人理解,仅供参考)

目录 一、前言 二、从Docker衔接到导入黑马点评 三、谈谈端口映射及我的前端登录显示用户或密码错误 四、总结 一、前言 在学习24黑马SpringCloud课程时&#xff0c;说实话Docker那一块再到导入黑马商城是真的有点折磨&#xff0c;个人感觉老师水平还是很强的&#xff0c;但…

控制建模matlab练习10:滞后补偿器

此练习主要是&#xff1a;关于滞后补偿器。 ①滞后补偿器作用&#xff1b; ②不同滞后补偿器的效果&#xff1b; 一、为什么使用滞后补偿器 滞后补偿器&#xff1a;主要用于改善系统的稳态误差&#xff1b;滞后补偿器设计思路&#xff1a;同时为系统增加一个极点和零点&#xf…

力扣-108.将有序数组转换为二叉搜索树

题目链接 108.将有序数组转换为二叉搜索树 class Solution {public TreeNode Traverse(int[] nums, int begin, int end) {if (end < begin)return null;int mid (begin end) / 2;TreeNode root new TreeNode(nums[mid]);root.left Traverse(nums, begin, mid - 1);ro…

`npm error code CERT_HAS_EXPIRED‘ 问题

问题: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://r2.cnpmjs.org/string_decoder/-/string_decoder-1.3.0.tgz failed, reason: certificate has expired npm error A complete log of this run can be found in: /home…

数据结构---概念、数据与数据之间的关系(逻辑结构、物理结构)、基本功能、数据结构内容、单向链表(概念、对象、应用)

数据结构在数据结构部分&#xff0c;研究数据在内存中如何存储。数据存储的形式有两种&#xff1a;变量和数组&#xff08;数据结构的顺序表&#xff09;。一、什么是数据结构&#xff1f;数据类型被用来组织和存储数据。程序设计 数据结构 算法二、数据与数据之间的关系1、逻…

CMS框架漏洞

一、WordPress姿势一1.下载vulhub靶场cd /vulhub/wordpress/pwnscriptum docker-compose up -d2.我们进入后台&#xff0c;网址拼接/wp-admin/3.我们进入WP的模板写入一句话木马后门并访问其文件即可GetShell4然后我们拼接以下路径/wp-content/themes/twentyfifteen/404.php&am…

控制建模matlab练习07:比例积分控制-③PI控制器的应用

此练习主要是比例积分控制&#xff0c;包括三部分&#xff1a; ①系统建模&#xff1b; ②PI控制器&#xff1b; ③PI控制器的应用&#xff1b; 以下是&#xff0c;第③部分&#xff1a;PI控制器的应用。 一、比例积分控制的应用模型 1、整个系统是如图&#xff0c;这样一个单位…

【MySQL】MySQL 中的数据排序是怎么实现的?

MySQL 数据排序实现机制详解 MySQL 中的数据排序主要通过 ORDER BY 子句实现&#xff0c;其内部实现涉及多个优化技术和算法选择。让我们深入探讨 MySQL 排序的完整实现机制。 一、排序基础&#xff1a;ORDER BY 子句 基本语法&#xff1a; SELECT columns FROM table [WHERE c…

JVM-垃圾回收器与内存分配策略详解

1.如何判断对象已死1.1 对象引用的4种类型&#xff08;强软弱虚&#xff09;1.1.1 强引用特点&#xff1a;最常见的引用类型&#xff0c;只要强引用存在&#xff0c;对象绝不会被回收Object strongObj new Object(); // 强引用注意&#xff1a;集合类型&#xff0c;如果对象不…

新手向:简易Flask/Django个人博客

从零开始搭建个人博客:Flask与Django双版本指南 本文将详细讲解如何使用两种主流Python框架构建功能完整的个人博客系统。我们将从零开始,分别使用轻量级的Flask框架和功能全面的Django框架实现以下核心功能: 用户认证系统: 用户注册/登录/注销功能 密码加密存储 会话管理…

使用 Trea cn 设计 爬虫程序 so esay

使用 Trea cn 设计 爬虫程序 so esay 在现代数据驱动的时代&#xff0c;网络爬虫已成为数据采集的重要工具。传统的爬虫开发往往需要处理复杂的HTTP请求、HTML解析、URL处理等技术细节。而借助 Trea CN 这样的AI辅助开发工具&#xff0c;我们可以更高效地构建功能完善的爬虫程…

MySQL Redo Log

MySQL Redo Log MySQL主从复制&#xff1a;https://blog.csdn.net/a18792721831/article/details/146117935 MySQL Binlog&#xff1a;https://blog.csdn.net/a18792721831/article/details/146606305 MySQL General Log&#xff1a;https://blog.csdn.net/a18792721831/artic…