Clobbering DOM attributes to bypass HTML filters

目录

寻找注入点

代码分析

payload构造

注入结果


寻找注入点

DOM破坏肯定是出现在js文件中,我们首先来看源码

 /resources/labheader/js/labHeader.js这个源码没什么问题我们重点关注在下面两个源码上

/resources/js/loadCommentsWithHtmlJanitor.js这个源码中重要的输入输出都被Htmlhanitor进行了一个过滤,也没有办法,接下来我们把目光移到最后一个代码上

/resources/js/htmlJanitor.js

代码分析

/resources/js/htmlJanitor.js代码分析

(function (root, factory) {if (typeof define === 'function' && define.amd) {define('html-janitor', factory);} else if (typeof exports === 'object') {module.exports = factory();} else {root.HTMLJanitor = factory();}}(this, function () {/*** @param {Object} config.tags Dictionary of allowed tags.* @param {boolean} config.keepNestedBlockElements Default false.*/function HTMLJanitor(config) {var tagDefinitions = config['tags'];var tags = Object.keys(tagDefinitions);var validConfigValues = tags.map(function(k) { return typeof tagDefinitions[k]; }).every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });if(!validConfigValues) {throw new Error("The configuration was invalid");}this.config = config;}//   config: 配置对象,包含允许的标签及其属性定义。
// tagDefinitions: 从配置中提取的标签定义。
// tags: 标签定义的键名数组。
// validConfigValues: 检查所有标签定义的值是否为合法的类型(object、boolean 或 function)。
// 如果配置无效,则抛出错误。否则,将配置存储在实例中var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];function isBlockElement(node) {return blockElementNames.indexOf(node.nodeName) !== -1;}
//   blockElementNames: 规定了哪些标签是块级元素。
//   isBlockElement: 判断节点是否为块级元素。var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];function isInlineElement(node) {return inlineElementNames.indexOf(node.nodeName) !== -1;}// inlineElementNames: 规定了哪些标签是行内元素。// isInlineElement: 判断节点是否为行内元素。HTMLJanitor.prototype.clean = function (html) {const sandbox = document.implementation.createHTMLDocument('');const root = sandbox.createElement("div");root.innerHTML = html;this._sanitize(sandbox, root);return root.innerHTML;};// 处理 HTML 字符串,将其插入到一个新的 HTML 文档中,然后调用 _sanitize 方法来清理 HTML,最后返回处理后的 HTML 字符串HTMLJanitor.prototype._sanitize = function (document, parentNode) {var treeWalker = createTreeWalker(document, parentNode);
//创建一个 TreeWalker 实例,用于遍历 parentNode 的子节点。var node = treeWalker.firstChild();//获取第一个节点if (!node) { return; }//如果没有节点就返回do {if (node.nodeType === Node.TEXT_NODE) {// If this text node is just whitespace and the previous or next element// sibling is a block element, remove it// N.B.: This heuristic could change. Very specific to a bug with// `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output// FIXME: make this an option?if (node.data.trim() === ''&& ((node.previousElementSibling && isBlockElement(node.previousElementSibling))|| (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {parentNode.removeChild(node);this._sanitize(document, parentNode);break;} else {continue;}}
//对于空白文本节点(tirm就是用来处理字符串让其没有空白节点),检查其是否位于块级元素的前后。如果是,则移除该文本节点,并递归调用 _sanitize 以处理 parentNode 重新遍历。处理完后,停止当前循环(break)// Remove all commentsif (node.nodeType === Node.COMMENT_NODE) {parentNode.removeChild(node);this._sanitize(document, parentNode);break;}
//移除注释节点,并递归调用 _sanitize 处理 parentNode。处理完后,停止当前循环var isInline = isInlineElement(node);var containsBlockElement;if (isInline) {containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);}// Block elements should not be nested (e.g. <li><p>...); if// they are, we want to unwrap the inner block element.var isNotTopContainer = !! parentNode.parentNode;var isNestedBlockElement =isBlockElement(parentNode) &&isBlockElement(node) &&isNotTopContainer;var nodeName = node.nodeName.toLowerCase();var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);var isInvalid = isInline && containsBlockElement;//   检查节点是否为行内元素(isInline)。
//   如果是行内元素,检查其子节点是否包含块级元素(containsBlockElement)。
//   检查节点是否为非顶级容器(isNotTopContainer)。
//   检查是否为嵌套的块级元素(isNestedBlockElement)。
//   获取节点的允许属性列表(allowedAttrs)。
//   判断是否无效(isInvalid):如果是行内元素且包含块级元素。if (isInvalid || shouldRejectNode(node, allowedAttrs)|| (!this.config.keepNestedBlockElements && isNestedBlockElement)) {// Do not keep the inner text of SCRIPT/STYLE elements.if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {while (node.childNodes.length > 0) {parentNode.insertBefore(node.childNodes[0], node);}}parentNode.removeChild(node);this._sanitize(document, parentNode);break;}//   如果节点无效、应该被拒绝,或是嵌套的块级元素且配置不允许嵌套,则://   如果节点不是 SCRIPT 或 STYLE,将其子节点移到 parentNode 中。
//   移除该节点。
//   递归调用 _sanitize 处理 parentNode,然后停止当前循环(break)// Sanitize attributesfor (var a = 0; a < node.attributes.length; a += 1) {var attr = node.attributes[a];if (shouldRejectAttr(attr, allowedAttrs, node)) {node.removeAttribute(attr.name);// Shift the array to continue looping.a = a - 1;}}//遍历节点的所有属性,并根据允许的属性列表决定是否移除属性。如果属性应该被拒绝,则移除该属性,并调整索引以重新检查移除后的属性// Sanitize childrenthis._sanitize(document, node);} while ((node = treeWalker.nextSibling()));};function createTreeWalker(document, node) {return document.createTreeWalker(node,NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,null, false);}// node: 指定 TreeWalker 遍历的起始节点。// NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT: 这是一个位掩码(bitmask),指定了 TreeWalker 应该包括哪些类型的节点。它包括:
//     NodeFilter.SHOW_TEXT: 过滤文本节点。
//     NodeFilter.SHOW_ELEMENT: 过滤元素节点。
//     NodeFilter.SHOW_COMMENT: 过滤注释节点。// 使用 | 运算符将这些常量合并成一个位掩码,使 TreeWalker 可以遍历这些节点类型。// null: 这是一个 NodeFilter 对象,用于定义哪些节点应该被包含或排除。设置为 null 表示不使用自定义的过滤条件,即所有符合上述类型的节点都会被遍历。// false: 指定 TreeWalker 是否应处理实体(例如字符实体)。设置为 false 表示不处理实体,这通常在处理普通文本和节点时不需要考虑。function getAllowedAttrs(config, nodeName, node){if (typeof config.tags[nodeName] === 'function') {return config.tags[nodeName](node);} else {return config.tags[nodeName];}}// 获取允许的属性集合function shouldRejectNode(node, allowedAttrs){if (typeof allowedAttrs === 'undefined') {return true;} else if (typeof allowedAttrs === 'boolean') {return !allowedAttrs;}return false;}// 判断节点是否应该被拒绝function shouldRejectAttr(attr, allowedAttrs, node){var attrName = attr.name.toLowerCase();if (allowedAttrs === true){return false;} else if (typeof allowedAttrs[attrName] === 'function'){return !allowedAttrs[attrName](attr.value, node);} else if (typeof allowedAttrs[attrName] === 'undefined'){return true;} else if (allowedAttrs[attrName] === false) {return true;} else if (typeof allowedAttrs[attrName] === 'string') {return (allowedAttrs[attrName] !== attr.value);}return false;}//判断属性是否应该被拒绝return HTMLJanitor;}));

payload构造

重点在这里,如果传递的参数是黑名单就删掉,只有form和input在,然后我们可以看一下这道题portswigger的Exploiting DOM clobbering to enable XSS-CSDN博客里面的第二道题有一块和下面的漏洞点很是相像。接着往下看

分析过后整体代码中行内元素的内嵌不可以是用那我们使用不是行内元素的元素,

使用这个元素<from><input>,我们就逃过了,然后我们构造的这个标签又没有父类,又绕过了

然后我们到这里看,我们构造<form><input id=attributes>,然后我们绕过以后form的attributes属性就是<input id=attributes>这个然后如果这个没有length属性就会跳出下面循环,然后就不删除了

然后经过上面的分析我们就要找一个标签没有length属性,让他跳出上面的for循环,所以就使用我们这个喽,然后在form里面构造我们的注入语句

<form tabindex=0 onfocus=alert(123)><input id=attributes>

注入结果

上面的payload是点击tab才可以触发,使用tabindex属性,已经插入进去了

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

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

相关文章

STM32cubeMX配置Systick的bug

STM32cubeMX版本&#xff1a;6.11.0 现象 STM32cubeMX配置Systick的时钟&#xff0c;不管选择不分频 还是8分频。 生成的代码都是一样的&#xff0c;代码都是不分频。 即不管选择不分频还是8分频&#xff0c;Systick都是使用的系统时钟 函数调用 HAL_Init() → HAL_Init…

HarmonyOS开发案例:列表场景实例-TaskPool

介绍 本实例通过列表场景实例讲解&#xff0c;介绍在TaskPool线程中操作关系型数据库的方法&#xff0c;涵盖单条插入、批量插入、删除和查询操作。 效果图预览 使用说明 进入页面有insert(单条数据插入)、batch insert(批量数据插入)、query(查询操作)三个按钮&#xff0c;…

【安卓】播放多媒体文件

文章目录 播放音频播放视频 播放音频 在Android中播放音频文件一般是使用MediaPlayer类实现的&#xff0c;它对多种格式的音频文件提供了非常全面的控制方法&#xff0c;从而使播放音乐的工作变得十分简单。 MediaPlayer类中常用的控制方法。 常用方法名描述setDataSource()设…

使用html+css+js实现完整的登录注册页面

在这篇博客中&#xff0c;我们将讨论如何使用简单的 HTML 和 CSS 构建一个登录与注册页面。这个页面包含两个主要部分&#xff1a;登录界面和注册界面。我们还会展示如何通过 JavaScript 切换这两个部分的显示状态。 页面结构 我们将创建一个页面&#xff0c;其中包含两个主要…

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器&#xff08;重点&#xff09; 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡&#xff08;重点&#xff09;

95后医疗行业女性转型记:如何成功踏入人工智能项目管理领域

分享目录 一、自我介绍&#xff0c;给大家分享一下拿到offer的心情吧 二、在整个求职转型陪跑营里&#xff0c;你收获最大的三个点是什么&#xff1f; 三、求职转行过程中&#xff0c;你遇到了哪些困难&#xff1f;七芊老师和强哥是怎么帮助你的&#xff1f;你是怎么走过来的…

seata的使用(SpringBoot项目整合seata)

文章目录 1、解压 seata-server-1.7.1.zip2、启动 双击 seata-server.bat3、启动 seata 控制台用户界面4、所有分布式事务相关数据库要有undo-log5、项目引入seata依赖6、项目添加seata配置7、代码实现&#xff1a; 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…

Polars简明基础教程十二:可视化(二)

设置绘图后端 我们可以使用 hv.extension 更改绘图后端。但是&#xff0c;我们不在此处运行此单元格&#xff0c;因为它会导致下面的 Matplotlib/Seaborn 图表无法渲染。 注释&#xff1a; hvPlot 利用 HoloViews 库来构建图表&#xff0c;并且可以使用多个后端进行渲染&…

微信小程序骨架屏

骨架屏是常用的一种优化方案&#xff0c;针对于页面还未加载完时给用户的一种反馈方式。如果自己要写骨架屏有点复杂因为页面的元素过多且不稳定&#xff0c;这边直接使用微信开发工具生成骨架屏。也不只有微信开发工具有像常用的抖音开发工具&#xff0c;字节开发工具都有对应…

使用MicroApp重构旧项目

前言 随着技术的飞速发展&#xff0c;我们公司内部一个基于“上古神器” jQuery PHP 构建的十年历史老项目已显力不从心&#xff0c;技术非常老旧且维护成本高昂&#xff0c;其实已经无数次想要重构&#xff0c;但是苦于历史遗留原因以及业务的稳定性而一直难以下手&#xff0…

Tomcat的核心文件讲解

参考视频&#xff1a;对应视频 server.xml中的以下部分可修改&#xff1a; 1.connector标签里的port可以修改。--修改端口号 Tomcat默认端口号&#xff1a;8080 <Connector connectionTimeout"20000" maxParameterCount"1000"port"8080" prot…

调研-音视频

音视频 基础概念主要内容音频基础概念音频量化过程音频压缩技术视频基础概念视频bug视频编码H264视频像素格式YUVRGB参考文献基础概念 ● 实时音视频应用环节 ○ 采集、编码、前后处理、传输、解码、缓冲、渲染等很多环节。 主要内容 音频 基础概念 三要素:音调(音频)、…

算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)

&#x1f600;前言 在编程过程中&#xff0c;链表是一种常见的数据结构&#xff0c;它能够高效地进行插入和删除操作。然而&#xff0c;遍历链表并找到特定节点是一个典型的挑战&#xff0c;尤其是当我们需要找到链表中倒数第 K 个节点时。本文将详细介绍如何使用双指针技术来解…

8.16 day bug

bug1 题目没看仔细 额外知识 在 Bash shell 中&#xff0c;! 符号用于历史扩展功能。当你在命令行中输入 ! 后跟一些文本时&#xff0c;Bash 会尝试从你的命令历史中查找与该文本相匹配的命令。这是一种快速重用之前执行过的命令的方法。 如何使用历史扩展 基本用法: !strin…

利用亚马逊云科技Bedrock和LangChain开发AI驱动数据分析平台

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上SageMak…

一次现网redis CPU使用率异常定位

背景 618大促前&#xff0c;运维对系统做巡检时发现redis cpu利用率白天基本保持在72%左右&#xff0c;夜里也在60%以上。担心618流量比平时大&#xff0c;导致redis超负荷&#xff0c;因此找开发进行优化&#xff0c;降低redis的负载。 定位思路 其实资源使用率过高定位都…

Taro+Vue 创建微信小程序

TaroVue 创建微信小程序 一、全局安装 tarojs/cli二、项目初始化三、现在去启动项目吧 一、全局安装 tarojs/cli npm install -g tarojs/cli //安装 npm info tarojs/cli //查看安装信息 如果正常显示版本说明成功了&#xff0c;就直接跳到第二步吧官网说&#xff1a;…

Unity引擎基础知识

目录 Unity基础知识概要 1. 创建工程 2. 工程目录介绍 3. Unity界面和五大面板 4. 游戏物体创建与操作 5. 场景和层管理 6. 组件系统 7. 脚本语言C# 8. 物理引擎和UI系统 学习资源推荐 Unity引擎中如何优化大型游戏项目的性能&#xff1f; Unity C#脚本语言的高级编…

【ML】Image Augmentation)的作用、使用方法及其分类

图像增强&#xff08;Image Augmentation&#xff09;的作用、使用方法及其分类 1. 图像增强的定义2. 图像增强的作用3. 什么时候使用图像增强&#xff1f;4. 图像增强详细方法分类梳理4.1 图像增强方法列表4.2 边界框增强方法5. 参考资料 yolov3&#xff08;一&#xff1a;模型…