您现在的位置是:首页 > 正文

DOM破坏绕过XSSfilter例题

2024-02-29 11:38:34阅读 1

目录

一、什么是DOM破坏

 二、例题1

​编辑 三、多层关系

1.Collection集合方式

2.标签关系

四、例题2

一、什么是DOM破坏

DOM破坏(DOM Clobbering)指的是对网页上的DOM结构进行不当的修改,导致页面行为异常、性能问题、安全风险或其他不良影响的情况。

就是⼀种将 HTML 代码注⼊⻚⾯中以操纵 DOM 并最终更改页面上 JavaScript 行为的技术

这里我们举一些例子就能更好地解释

 

可以看到打印的结果如下

通过打印<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>标签

所以这两个标签我们可以利用

 二、例题1

 

然后我们来看一道例题Ok, Boomer. | XSS Warmups

XSS Game - Ok, Boomer | PwnFunction

这道题通过get参数将内容写入h2标签内,而且有过滤框架DOMPurify

这个过滤框架由安全团队cure53开发,以我们的技术很难绕过

但是注意setTimeout函数内的ok参数

这里的JS代码是没有任何关于ok参数的定义的,所以我们可以使用DOM破坏

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

payload:

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

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

 三、多层关系

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

 

显然不行,返回undefined 

 

1.Collection集合方式

既然直接x.y不行,那我们可以用一个集合来做x,然后再获取y

此时x指代了一个集合,既有div也有a标签,然后再获取它的y属性

 

 

2.标签关系


要想知道哪些标签能直接调用x.y,可以通过一段代码来获取,但代码有点长,就直接说结果了

form---button
from---fieldset
from---img
from---image
from---input
from---object
from---output
from---select
from---textarea
这九种组合可以直接调用x.y,来获取子标签内容

比如

 

 

3.三层标签如何获取
如果有三层标签,就需要要⽤到以上两种技巧来构建了

先分析x.y,x是一个集合,然后获取y,利用了第一种方法--集合方式,获取了第一个form标签

然后x.y.z,因为form和output标签存在关系,可以直接调用y.z,利用了第二种方法--标签关系

最后x.y.z.value就成功拿到output标签内的内容

 

四、例题2


首先审计代码,data为URL后的hash值,然后创建了一个div标签,把我们输入的hash值放进了div这个标签里面

第一个for循环拿出了div元素的所有后代元素,用el表示

定义了一个空数组attrs

第二个for循环拿出了后代元素的所有属性,用attr表示

然后将属性添加到attrs数组里

第三个for循环拿出了attrs数组里面的属性,用name表示

然后移除掉这个元素的该属性

最后将div添加到body里面去

const data = decodeURIComponent(location.hash.substr(1));
const root = document.createElement('div');
root.innerHTML = data;
 
// 这里模拟了XSS过滤的过程,方法是移除所有属性
for (let el of root.querySelectorAll('*')) {
    let attrs = [];
    for (let attr of el.attributes) {
        attrs.push(attr.name);
    }
    for (let name of attrs) {
        el.removeAttribute(name);
    }
}
 
document.body.appendChild(root); 

可见这道例题是移除掉我们输入标签的所有属性

既然不能有属性,那直接输入<script>alert(1)</script>不就行了吗

答案是不可以的,因为innerHTML考虑到安全问题将script过滤掉了

这道题可以使用DOM破坏和CSS来触发XSS

直接来看payload

 <style>@keyframes x{}</style><form style="animation-name:x" onanimationstart="alert(1)"><input id=attributes><input id=attributes></form>

 

首先定义了一个CSS动画@keyframes x{},然后form表单里面调用这个样式

然后属性onanimationstart执行alert,意思是当animation动画开始时执行alert

CSS样式我已经忘得差不多了,但是大概是这样一个意思

我们再看后面的内容,一个form表单内包含两个id属性为attributes的input标签

看到这个id属性值应该能猜到这是什么作用了,没错,它就是用来破坏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标签,因为此时目的已经达到,删除了属性也无妨

最后成功绕过

网站文章

  • 如何判断链表有环的三种解法(Python)

    一、问题描述 二、解题思路 三、最优解的代码实现 一、问题描述 有一个单向链表,链表中有可能出现环,如何判断链表是否有环? 二、解题思路 方法一: 首先从头节点开始,依次遍历单链表中的每一个节点。每遍...

    2024-02-29 11:38:04
  • 全国计算机考试实验室建设,实验室介绍

    1.2001年计算中心验室被辽宁省教委授予“合格实验室”称号2.2009年东北大学秦皇岛分校考点被教育部评为“全国计算机等级考试优秀点。3.2010年获辽宁省教学厅“2009-2010年度辽宁省普通高...

    2024-02-29 11:37:58
  • C#-2 C#程序

    C#-2 C#程序

    一 C#程序是一组类型声明C#程序或DLL的源代码是一组一种或多种类型声明。对于可执行程序,类型声明中必须有一个包含Main方法的类。命名空间是一种把相关的类型声明分组并命名的方法。是类在程序集中逻辑...

    2024-02-29 11:37:44
  • 用java语言求前50个素数_显示前50个素数

    package my.group.mapreduce1;import java.util.Scanner;public class Djsi {public static void main(String[] args){int NUMBER_OF_PRIMES = 50; //设置输出素数的个数int count = 0; //计数int number = 2; //从2开始查找Syst...

    2024-02-29 11:37:14
  • 记录网页制作中遇到的问题及解决办法(长期更新)

    1.html在浏览器打开后出现"白边"原因:浏览器默认边距值不是0解决:在<head></head>内加入以下内容:<style type="text/css">*{margin:0;padding:0;}</style>

    2024-02-29 11:37:08
  • 【Python】实现csv文件转json文件

    import json import pandas as pd # 读取CSV文件 csvData = pd.read_csv(r&#39;testData.csv&#39;, header = 0)...

    2024-02-29 11:37:02
  • 计算机游戏专业宣传语,游戏的广告词_游戏推广广告词

    现在有很多的游戏,电脑或者手机上的都很多,在每一款游戏推出的时候,都会用创意的广告词进行推广,吸引人玩游戏。下面是学习啦小编为你整理的游戏的广告词,希望对你有用!最新游戏的广告词1.狭路相逢,谁与争锋...

    2024-02-29 11:36:33
  • 概率论——几何随机变量

    几何随机变量 1 定义   对于独立的重复试验,每次试验成功的概率为p,0≤p≤1p,0\le p \le 1p,0≤p≤1,我们知道nnn次试验成功的次数符合参数为(n,p)(n,p)(n,p)的二项分布。现在考虑随机变量XXX,XXX表示重复试验直到试验首次成功为止需要的试验次数,则有: P{X=n}=p(1−p)n−1 ...

    2024-02-29 11:36:26
  • 基于SSM框架疫情隔离酒店管理系统

    基于SSM框架疫情隔离酒店管理系统

    任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于Java语言设计并实现了疫情隔离酒店管理系统。该系统基于B/S即所谓浏览...

    2024-02-29 11:36:21
  • Mysql高级四 之 优化SQL步骤

    Mysql高级四 之 优化SQL步骤

    优化SQL步骤 在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生...

    2024-02-29 11:35:52