51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

请解释DOM-based XSS漏洞的原理,与反射型XSS的区别,并说明如何利用该漏洞执行恶意脚本,以及如何防御。

360助理安全研究员(漏洞挖掘与利用)难度:中等

答案

1) 【一句话结论】

DOM-based XSS 是一种由客户端脚本解析用户输入并执行的跨站脚本漏洞,核心是用户输入被直接插入到 DOM 树中,浏览器在解析 DOM 时触发恶意脚本,与反射型 XSS 的关键区别在于脚本执行由客户端而非服务器端触发。

2) 【原理/概念讲解】

同学们,先理解 DOM 是浏览器解析 HTML 后构建的树形结构,每个节点(如 div、按钮)都是可操作的对象。DOM-based XSS 的原理是:用户输入被当作脚本代码插入到 DOM 节点(比如事件监听器属性或直接插入节点内容),浏览器在处理这些节点时,会直接执行插入的脚本。简单类比:把 DOM 看作一个“脚本执行环境”,用户输入变成这个环境里的代码片段,浏览器启动这个环境,运行代码。具体来说,触发点通常包括:

  • 事件监听器属性(如 onclick、onerror):直接将用户输入赋值为事件处理程序;
  • DOM 属性动态赋值(如 src、href 的动态更新);
  • 直接插入节点内容(如 innerHTML、textContent,其中 innerHTML 是典型,因为直接插入 HTML)。

执行流程是:用户输入(如恶意脚本)通过 URL 参数或表单提交进入客户端;客户端脚本将输入插入 DOM 节点(比如 document.getElementById('content').innerHTML = userInput);浏览器解析 DOM 时,触发恶意脚本(如弹窗、窃取 cookie)。

3) 【对比与适用场景】

特性/场景反射型XSSDOM-based XSS
定义用户输入被包含在服务器返回的 HTML 中,客户端接收后执行用户输入被直接插入到 DOM 树中,浏览器解析 DOM 时执行
触发点服务器端处理请求,返回包含输入的 HTML客户端脚本解析用户输入,修改 DOM 后执行(如事件监听器、动态属性赋值)
依赖服务器返回包含输入的页面客户端脚本解析用户输入并修改 DOM
使用场景用户输入出现在页面中(如搜索结果、表单反馈)用户输入被插入到 DOM 节点(如事件处理、动态内容渲染,如按钮点击触发脚本)
注意点需要用户主动访问包含输入的页面需要用户访问页面后,输入被 DOM 解析执行(不一定需要点击,客户端直接执行)

4) 【示例】

假设一个网页有一个按钮,用户输入被赋值给按钮的 onclick 事件处理程序。用户输入:alert('hacked')。页面伪代码:

<button id="btn"></button>
<script>
  const userInput = new URLSearchParams(window.location.search).get('cmd'); // URL 参数
  document.getElementById('btn').onclick = userInput; // 事件监听器直接赋值用户输入
</script>

当用户访问 example.com/?cmd=alert('hacked') 时,浏览器解析 DOM,触发按钮的 onclick 事件,执行 alert('hacked') 脚本。

5) 【面试口播版答案】

面试官您好,DOM-based XSS 核心是客户端脚本解析用户输入并执行。简单说,就是用户输入被直接插入 DOM 树,浏览器在解析 DOM 时触发恶意脚本。与反射型 XSS 区别在于,反射型是服务器返回时包含输入,客户端接收后执行;而 DOM-based 是客户端处理输入,修改 DOM 后执行。比如用户输入被插入到某个元素的 onclick 事件处理程序,浏览器直接执行。利用的话,构造恶意输入(如 <script>alert('hacked')</script>),用户访问页面后脚本被 DOM 解析执行。防御方面,主要是避免用事件监听器直接赋值用户输入(改用 DOM 文本节点插入),或者对用户输入进行 HTML 转义(比如用 textContent 替代 innerHTML),以及启用内容安全策略(CSP),限制脚本来源,防止外部脚本执行。

6) 【追问清单】

  • 问:如何区分 DOM-based 和反射型 XSS?
    答:看脚本执行是否由客户端触发,反射型是服务器返回后客户端执行,DOM-based 是客户端处理输入后执行。
  • 问:如果页面有 CSP,DOM-based 还能利用吗?
    答:CSP 可限制脚本来源,但 DOM-based 的执行是在当前页面上下文,若输入被 DOM 解析,CSP 需要更严格的策略(如禁止所有外部脚本,或允许自执行脚本,实际中可能需要调整 CSP 以允许当前页面的脚本执行)。
  • 问:防御 DOM-based 的具体措施有哪些?
    答:输入验证(转义 HTML 特殊字符)、避免用 innerHTML 插入用户输入(改用 textContent 或 insertAdjacentText),以及内容安全策略(CSP)限制脚本执行。
  • 问:DOM-based 是否需要用户点击链接?
    答:不一定,客户端直接执行,只要用户访问页面,输入被 DOM 解析就会触发,比如事件监听器直接赋值用户输入,页面加载后立即执行。

7) 【常见坑/雷区】

  • 混淆触发点:认为 DOM-based 需要用户点击链接,其实事件监听器直接赋值用户输入时,页面加载后立即执行。
  • 防御只考虑服务器端:仅做输入验证,忽略客户端 DOM 操作(如 innerHTML 插入),导致客户端仍可利用。
  • 例子错误:假设 DOM-based 需要用户输入在 URL 参数,其实表单输入同样适用,比如表单提交后页面跳转,用户输入被插入 DOM。
  • 误解 DOM 树作用:认为 DOM-based 是服务器端解析,实际客户端解析 DOM 时执行脚本。
  • CSP 策略错误:用 CSP 阻止所有外部脚本,但 DOM-based 执行在当前页面,若输入被 DOM 解析,CSP 需要允许当前页面的脚本执行,否则可能无效。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1