
本文实验均在个人本地部署、合法授权的 OWASP Juice Shop 靶场环境中完成仅用于安全学习、漏洞分析与防御研究。DOM XSS一 漏洞发现与验证1.确认可控输入点在搜索框中输入xss-probe-dom-001,观察搜索结果区域是否回显该字段确认用户输入可影响页面DOM。2.HTML注入验证在搜索界面输入xss-probe-dom-001,观察回显字段是否加粗与上张图对比可知字段明显加粗被当作HTML内容解析存在注入点。3.script标签执行验证在搜索处构建scriptalert(1)/script观察是否弹窗在开发者工具界面观察到script标签已经进去DOM但未被执行。4.事件触发型 JavaScript 执行验证构造带有错误事件处理器的 HTML 元素构造img src1 onerroralert(1)观察是否弹窗弹窗成功触发JS执行存在DOM XSS。二 原理分析1.Source 与 SinkDOM XSS 通常可以抽象为Source↓前端 JavaScript↓Sink↓HTML / JavaScript 执行Source攻击者可控数据来源例如URL 参数locationlocation.hash搜索关键词Sink会把输入当作 HTML 或代码处理的位置例如innerHTMLouterHTMLdocument.write()某些 HTML 渲染 API2.本案例的数据流在搜索框中输入内容↓搜索关键字进入 URL / 前端状态↓前端 JavaScript 获取搜索关键字↓将关键字写入搜索结果 DOM↓输入被浏览器按照 HTML 解析↓事件处理器触发 JavaScript↓形成 DOM XSS3.HTML 注入与 XSS 的区别HTML 注入btest/b如果页面显示为粗体说明浏览器将用户输入作为 HTML 解析。但是 HTML 注入本身并不一定等于 XSS。XSS 还要求用户输入最终能够触发 JavaScript 执行因此HTML 注入≠XSS但HTML 注入可执行 JavaScriptXSS4.为什么 script 没执行但事件处理器可以执行动态插入 DOM 的 script 元素在某些情况下不会自动执行但浏览器解析 HTML 元素后其事件处理属性仍可能在相应事件发生时执行 JavaScript。三 源码分析1.观察源码bypassSecurityTrustHtml是Angular的安全绕过API。Angular默认模板插值会自动对内容做HTML编码防止XSS一旦调用这个方法就是告诉Angular这个字符串是可信HTML不要对它做转义直接渲染成 DOM。2.源码修复移除bypassSecurityTrustHtml由 this.searchValue this.sanitizer.bypassSecurityTrustHtml(queryParam) 改为 this.searchValue queryParamAngular普通插值{{ searchValue }}默认自动HTML编码输入的 全部实体编码只会当成纯文本展示不会解析HTML标签。