)
网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载本文以 PayloadsAllTheThings 仓库的 DOM Clobbering/README.md 为主体系统讲解 DOM Clobbering 的核心原理、逐级利用手法与过滤器绕过技巧。DOM Clobbering 是一种通过命名 HTML 元素的id/name属性来覆写clobber全局变量或 DOM 属性进而改变脚本执行行为并诱发安全漏洞的攻击技术。读完本文你将掌握从x.y到多层嵌套a.b.c.d的完整载荷构造方法、跨浏览器差异Chrome / Firefox利用、document.getElementById()覆写技巧以及结合 DOMPurify 等 HTML 过滤器的绕过思路可直接用于 Web 渗透测试与 CTF 实战。什么是 DOM Clobbering浏览器在解析 HTML 时会依据标准将带有id属性的元素自动暴露为window上的全局变量并将带有id/name的元素挂载到document的命名属性named property中。攻击者如果能在页面中注入任意 HTML即具备HTML injection能力就可以通过精心构造的元素命名让脚本中原本引用全局变量、DOM 属性或集合成员的代码实际解析到攻击者控制的元素节点上——这就是 DOM Clobbering。正如 DOM Clobbering/README.md 开篇所述DOM Clobbering is a technique where global variables can be overwritten or clobbered by naming HTML elements with certain IDs or names. This can cause unexpected behavior in scripts and potentially lead to security vulnerabilities.这种意外行为往往会被进一步放大为 DOM XSS当目标页面的 JavaScript 读取某个变量并把它当作 HTML 片段、URL 或属性值使用时被覆写的变量内容就能以攻击者可控的方式流入危险 sink。利用前提利用 DOM Clobbering 的前提是页面中存在任意形式的 HTML injection 点——例如用户可控内容被未加过滤地反射进 HTML、通过innerHTML写入、或经由 URL 片段 /srcdoc等渠道进入 DOM。这与仓库中 XSS Injection/README.md 所整理的各类注入场景同源先获得 HTML 注入再借助 DOM Clobbering 把注入升级为可执行代码。涉及的工具以下工具可以帮助测试者生成、筛选 DOM Clobbering 载荷并验证不同浏览器与 HTML 解析器 / 过滤器下的行为SoheilKhodayari/DOMClobbering—— 面向移动端与桌面端浏览器整理的 DOM Clobbering 载荷大全payload 列表。yeswehack/Dom-Explorer—— 基于 Web 的测试工具用于测试各种 HTML 解析器与 sanitizer 对载荷的处理结果。yeswehack/Dom-Explorer Live—— Dom-Explorer 的在线演示环境可直观展示浏览器如何解析 HTML并帮助发现变异型 XSSmutated XSS。其中 Dom-Explorer 一类的工具尤其适合在构造载荷后快速比对输入 HTML → 各解析器输出的差异与 XSS Injection/README.md 中介绍的 Mutated XSS利用浏览器解析怪癖重建 HTML 标签形成互补。利用方法论从浅到深的 Clobbering 载荷1. 覆写x.y.value最简单的形态用嵌套元素把x.y.value这条属性访问链顶替为攻击者可控的文本。// Payload form idxoutput idyIve been clobbered/output // Sink scriptalert(x.y.value);/script浏览器会把idx的form暴露为全局变量x而form元素支持按id/name命名访问其内部控件因此idy的output成为x.yx.y.value即为output的value属性弹出Ive been clobbered。这类表单 控件的组合是后续所有深层载荷的基础构造单元。2. 用id与name组合形成 DOM 集合覆写x.y当页面同时存在多个同名元素时window.x不再是单个元素而是一个 DOM 集合HTMLCollection / RadioNodeList 等集合又支持按name进行命名访问于是id与name可以配合起来把属性访问链延长一层// Payload a idxa idx namey hrefClobbered // Sink scriptalert(x.y)/script两个a idx使x成为元素集合其中第二个a带namey因此x.y命中该元素alert(x.y)将元素强制转为字符串时取到其href属性值Clobbered元素的字符串化即href的序列化结果。3. 覆写x.y.z—— 三层嵌套三层访问链需要集合 命名表单 控件三级配合// Payload form idx nameyinput idz/form form idx/form // Sink scriptalert(x.y.z)/script两个idx的表单构成集合x第一个表单带有namey于是x.y通过集合的命名访问命中该表单表单元素支持按id/name访问内部控件idz的input即x.y.z。注意第二个form idx/form是必需的它让x从单个元素升级为元素集合从而开启基于name属性的命名访问路径。这是理解 DOM Clobbering 层级构造的关键点。4. 覆写a.b.c.d—— 突破三层限制标准 DOM 结构最多只能自然形成三层访问链但借助iframe的嵌套文档可以进一步突破iframe的name属性同样会成为window上的命名属性而内层文档中的元素又能在外层被继续引用// Payload iframe namea srcdoc iframe srcdoca idc named hrefcid:Clobberedtest/aa idc nameb/iframe styleimport //portswigger.net;/style // Sink scriptalert(a.b.c.d)/script构造逻辑逐层展开外层iframe namea使window.a指向该 iframe 的窗口对象iframe 的srcdoc中再嵌套iframe nameba.b指向内层 iframe 窗口内层srcdoc中有a idc named hrefcid:Clobbered与a idc两个idc构成集合c其中带named的元素使c.d命中hrefcid:Clobbered的锚点最终a.b.c.d即为该锚点的href序列化结果cid:Clobbered。附带说明该载荷示例中混入的styleimport .../style是原文档中保留的与外部探测相关的装饰性片段实际利用时可将cid:替换为目标环境允许读取的内容。cid:协议之所以被选作载体详见后文Tricks部分。5. 覆写forEach仅 Chrome某些框架的代码会直接对 DOM 集合调用forEach例如遍历表单控件而 HTML 集合在特定浏览器中可被构造为带forEach的对象// Payload form idx input idy namez input idy /form // Sink scriptx.y.forEach(elementalert(element))/scriptidy的两个input使x.y成为一个可迭代的控件集合RadioNodeList 形态该集合在 Chrome 下暴露forEach方法从而让攻击者可控元素进入alert(element)的回调。该技巧仅在 Chrome 生效Firefox / Safari 对集合forEach的支持不同。6. 覆写document.getElementById()一般情况下getElementById返回文档中id匹配的元素但借助html/body标签的特殊地位可以干扰其查找结果使其返回攻击者控制的元素// Payloads html idcdnDomainclobbered/html svgbody idcdnDomainclobbered/body/svg // Sink script alert(document.getElementById(cdnDomain).innerText);//clobbbered /script当脚本用document.getElementById(cdnDomain)去读取某个安全的域名配置例如 CDN 域名时攻击者通过注入同名id的html/svgbody元素让getElementById命中攻击者控制节点innerText返回clobbered。这属于DOM 属性覆写绕过 HTML 过滤器的典型场景代码以为在读配置实际读到的是注入内容。7. 覆写x.usernameaHTMLAnchorElement自带 URL 解析属性href中的用户名与密码部分会被解析为可读属性// Payload a idx hrefftp:Clobbered-username:Clobbered-Passworda // Sink script alert(x.username)//Clobbered-username alert(x.password)//Clobbered-password /script浏览器将href按 URL 语法解析ftp:协议下的user:passhost结构被拆分为username与password两个属性。许多单点登录 / OAuth 流程会把x.username等值拼进请求或页面从而被注入任意字符串。8. 浏览器特化技巧FirefoxFirefox 在解析相对base与href时的行为差异可被用来在alert(x)中直接取出含的原始字符串// Payload base hrefa:abca idx hrefFirefox // Sink script alert(x)//Firefox /script9. 浏览器特化技巧ChromeChrome 下base元素同样可以影响锚点href的解析结果配合命名集合取出覆写后的字符串// Payload base hrefa://Clobbereda idx namexa idx namexyz href123 // Sink script alert(x.xyz)//a://Clobbered /script两个a idx构成集合namexyz的元素命中x.xyz其href123在解析时以base hrefa://Clobbered为基准最终序列化得到a://Clobbered。这类技巧的价值在于某些过滤器只拦截看起来像 URL的字符串却对经base重写后出现的特殊字符序列疏于防范。Tricks绕过 DOMPurify 等 HTML 过滤器DOM Clobbering 的真正威力在于绕过 HTML sanitizer。以 DOMPurify 为例该库是业界广泛使用的 HTML 过滤组件仓库 XSS Injection/4 - CSP Bypass.md 也多次提及针对它的绕过研究DomPurify 允许协议cid:且不会对该协议下的双引号进行编码a iddefaultAvatara iddefaultAvatar nameavatar hrefcid:quot;onerroralert(1)//攻击链拆解DOMPurify 放行cid:协议因此整条href属性得以保留属性值中的quot;HTML 实体形式的双引号未被编码或转义原样通过过滤器浏览器解析这段 HTML 时把quot;还原为真实的从而从href属性值中闭合出新的属性形成onerroralert(1)两个a iddefaultAvatar构成集合确保defaultAvatar引用到带恶意href的那个元素最终在相关 sink 中被触发。这与 XSS Injection/README.md 中记录的 Mutated XSS 思路一脉相承过滤器认为安全的输入在经过浏览器解析器的二次处理后发生变异变成可执行的攻击代码。防御视角与检测建议从仓库文档给出的载荷可以总结出防御与检测要点以下为通用工程实践非仓库原文结论优先消灭 HTML 注入点DOM Clobbering 的成立前提是页面存在 HTML 注入因此对所有反射 / 存储的用户输入坚持上下文相关的输出编码是成本最低的缓解措施。审查危险 sink 的取值方式代码中形如window.x.y.z、document.getElementById(name)、elements.name、.username / .password、集合forEach的引用都应视为潜在 clobber 目标优先改用getElementById后校验节点类型、Object.prototype.hasOwnProperty检查或显式从可信来源读取配置。对 sanitizer 的协议白名单做最小化如cid:、data:等非必要协议应及时从允许列表中移除避免为实体解码绕过留下空间。跨浏览器回归测试由于 Chrome / Firefox 对命名集合、base解析、forEach暴露的行为存在差异测试应覆盖多浏览器防止本地不可触发、线上可触发的漏判。实战演练与相关资源建议按以下路径进行实操理解注入前提先在 XSS Injection/README.md 中熟悉 HTML 注入与 DOM XSS 的整体脉络特别是其中的 Mutated XSS 章节L542-L550。练习过滤器绕过结合 XSS Injection/4 - CSP Bypass.md 理解 CSP / 过滤器场景再回到本文的 Tricks 部分尝试在真实 sanitizer 环境中复现cid:载荷。完成靶场题目原文档收录了三道 PortSwigger 实验室题目分别是利用 DOM clobbering 实现 XSS、覆写 DOM 属性绕过 HTML 过滤器以及受 CSP 保护的 DOM clobbering 测试用例正好覆盖本文的三类核心场景基础层级构造、过滤器绕过、CSP 场景下的利用。参考研究本文内容整理自以下公开研究按文档收录顺序Bypassing CSP via DOM clobbering—— Gareth Heyes2023 年 6 月 5 日DOM ClobberingHackTricks 词条—— 2023 年 1 月 27 日DOM ClobberingPortSwigger Web Security 主题—— 2020 年 9 月 25 日DOM Clobbering strikes back—— Gareth Heyes2020 年 2 月 6 日Hijacking service workers via DOM Clobbering—— Gareth Heyes2022 年 11 月 29 日其中DOM Clobbering strikes back系统阐述了本文第 2、3、6 节所述的多层集合构造与getElementById覆写原理是深入理解该技术的推荐起点。赞分享网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载相关推荐如何修复GyroFlow索尼镜头配置文件加载失败完整视频稳定诊断指南如何修复GyroFlow索尼镜头配置文件加载失败完整视频稳定诊断指南 GyroFlow 是一款基于陀螺仪数据的开源视频稳定工具用相机内置陀螺数据消除画面抖动视频处理桌面应用音视频让网页元素变身图片dom-to-image实战指南让网页元素变身图片dom to image实战指南 还在为无法将精美的网页设计保存为图片而烦恼吗想不想把动态交互界面一键转换为可分享的图像dom to i前端Stimulus Targets 完全指南用 data-*-target 按名称引用 DOM 元素Stimulus Targets 完全指南用 data target 按名称引用 DOM 元素 Targets目标引用是 Stimulus 中把 HTML前端上一篇如何定制Flipper Zero Evil Portal创建个性化钓鱼页面的完整教程下一篇WxJava Spring Boot Starter使用指南快速集成微信生态的完整方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考