chevron-right 从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家) arrow-up-right ! hashtag 你在网络安全公司 工作吗?想要看到你的公司在HackTricks上做广告 吗?或者想要获取PEASS的最新版本或下载HackTricks的PDF 吗?查看订阅计划 arrow-up-right !
可以使用HTML标签中的**id和 name属性在JS上下文中生成 全局变量**。
复制 < form id = x ></ form >
< script > console . log ( typeof document . x ) // [object HTMLFormElement] </ script > 只有 某些元素可以使用name属性 来覆盖全局变量,它们是:embed、form、iframe、image、img和object。
有趣的是,当您使用form元素 来覆盖 一个变量时,您将获得元素本身的**toString值: [object HTMLFormElement] ,但使用 anchor时, toString将是锚点的 href。因此,如果您使用 a标签来覆盖,您可以在将其视为字符串时 控制该 值**:
复制 < a href = " controlled string " id = x ></ a >
< script >
console . log ( x ); // controlled string
</ script > 也可以篡改数组 和对象属性 :
复制 < a id = x >
< a id = x name = y href = controlled >
< script >
console . log ( x [ 1 ]) // controlled
console . log ( x . y ) // controlled
</ script > 要覆盖第三个属性 (例如 x.y.z),您需要使用一个**form**:
通过使用 iframes,覆盖更多属性 会变得更加复杂但仍然可能 :
circle-exclamation
样式标签用于给iframe足够的时间来渲染。如果没有它,你会发现一个未定义的警报。
要深入破坏更多属性,可以使用带有HTML编码的iframe,如下所示:
如果一个过滤器正在通过类似 document.getElementByID('x').attributes 这样的方式循环 遍历节点的属性 ,你可以覆盖 属性**.attributes并 破坏过滤器**。其他 DOM 属性如**tagName、 nodeName或 parentNode等也是可以 覆盖**的。
Clobbering window.someObject
在 JavaScript 中经常会发现:
操纵页面上的HTML允许用DOM节点覆盖someObject,可能引入安全漏洞。例如,您可以用指向恶意脚本的锚元素替换someObject:
在一个易受攻击的代码中,例如:
这种方法利用脚本源来执行不需要的代码。
技巧 :DOMPurify 允许您使用 cid: 协议,该协议不会对双引号进行 URL 编码 。这意味着您可以注入一个编码的双引号,在运行时将被解码 。因此,注入类似于 <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//"> 这样的内容将使 HTML 编码的 " 在运行时解码 并从属性值中逃逸 ,以创建 onerror 事件。
另一种技术使用了一个 form 元素。某些客户端库会检查新创建的表单元素的属性以进行清理。但是,通过在表单内添加一个带有 id=attributes 的 input,您实际上覆盖了属性,阻止了消毒剂访问实际属性。
您可以在这篇 CTF 解密中找到这种类型的覆盖示例 。
根据文档,可以使用 DOM 覆盖来覆盖文档对象的属性:
文档arrow-up-right 接口支持命名属性arrow-up-right 。文档arrow-up-right 对象在任何时刻支持的属性名称包括以下内容,按照贡献它们的元素的树顺序arrow-up-right 排列,忽略后续的重复,并且在相同元素同时贡献 id 属性和 name 属性时,来自 id 属性的值优先于来自 name 属性的值:
- 所有具有非空名称内容属性并且在文档树中具有文档作为根arrow-up-right 的公开arrow-up-right embedarrow-up-right 、formarrow-up-right 、iframearrow-up-right 、imgarrow-up-right 和公开arrow-up-right objectarrow-up-right 元素的名称内容属性的值;
- 所有具有非空idarrow-up-right 内容属性并且在文档树中具有文档作为根arrow-up-right 的公开arrow-up-right objectarrow-up-right 元素的idarrow-up-right 内容属性的值;
- 所有具有非空idarrow-up-right 内容属性和非空名称内容属性的idarrow-up-right 内容属性的值的imgarrow-up-right 元素,且在文档树中具有文档作为根arrow-up-right 。
使用这种技术,您可以覆盖常用的值,如 document.cookie、document.body、document.children,甚至文档接口中的方法,如 document.querySelector。
对 document.getElementById() 和 document.querySelector() 的调用结果可以通过注入具有相同id属性的 <html> 或 <body> 标签来进行更改。以下是如何实现的:
此外,通过使用样式来隐藏这些注入的HTML/body标签,可以防止innerText中其他文本的干扰,从而增强攻击的效果:
调查发现SVG可以有效地利用<body>标签:
要使HTML标签在Chrome和Firefox等浏览器中在SVG内起作用,需要使用<foreignobject>标签:
可以通过在某些标签中指定form属性来向表单中添加新条目。您可以使用这种方法向表单中添加新值,甚至可以添加一个新的按钮来发送它(点击劫持或滥用一些.click() JS代码):
Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker.
chevron-right 从零开始学习AWS黑客技术 htARTE (HackTricks AWS Red Team Expert) arrow-up-right ! hashtag 您在网络安全公司 工作吗? 您想看到您的公司在HackTricks中做广告 吗? 或者您想访问PEASS的最新版本或下载PDF格式的HackTricks 吗? 请查看订阅计划 arrow-up-right !