标签名里藏 JavaScript:localName 保小写绕过 WAF
标签名里藏 JavaScript:localName 保小写绕过 WAF
一句话:HTML 标签名虽被浏览器转大写存储,但 DOM 的 localName 保留小写版本——
Gareth Heyes 用这一点把 payload 整个塞进标签名,绕过针对属性/标签结构的 WAF 与黑名单,
全浏览器通用。
要点:
- 核心原语:
<alert(1) onfocus="attributes[0].value=localName,new onfocus" autofocus tabindex=1>——
事件处理器里把小写标签名写回 handler 再以构造函数执行;大写 payload 可用
<JAVASCRIPT:ALERT(1) onfocus=location=localName>走 location - fuzz 发现:字母/斜杠/空白会被转换,但行/段落分隔符(U+2028/2029)不转换且在 JS 中
等效换行,可造出无空格 payload;<也能出现在标签名内,与首个属性拼出全新标记 - 变体丰富:
attributes[0].textContent / .nodeValue、getAttributeNode、part/classList
转 DOMTokenList 后借eval执行、setHTMLUnsafe、contenteditable替代 tabindex 聚焦 - LLM(Sol 5.6)参与 fuzz 找到多个作者未想到的变体——payload 生成自动化的一个小样本
原语抽象:同一标记的两个视图(序列化文本 vs DOM localName)之间的语义差异
本身就是 payload 载体——过滤器的输入视图和执行引擎的输入视图不一致。
亲戚手法:浏览器解析差异家族(mXSS、SVG/MathML 命名空间混淆)的新成员;
差异:不依赖命名空间切换,靠属性回读(attributes[0].value = localName),
全浏览器通用、更难在过滤器层封死。
防御启示:基于序列化文本的黑名单/正则挡不住 DOM 层回读,净化必须在解析后
的 DOM 上做并以 DOM 为准验证。
原文: https://portswigger.net/research/whats-in-a-tag-name-javascript-apparently
来源发布时间: 2026-08-25