实操(Lab)|输出编码与 DOM XSS
XSS 的根因是”把不可信数据当代码渲染”。本 Lab 用一段漏洞代码 + Burp DOM Invader 复现 DOM XSS,体会 source→sink 链路。
目标
- 理解 DOM XSS 与反射/存储 XSS 的区别(载荷只在浏览器内流动,服务器从没见过)。
- 用 Burp 内置浏览器的 DOM Invader 找出 source→sink。
环境
- 任意含如下前端代码的页面(或实验室如 PortSwigger Web Security Academy 的 DOM XSS 题)。
- Burp Suite Community(见 Burp 上手)。
漏洞代码(示例)
<!-- 危险:把 URL 片段直接写进页面 -->
<script>
var name = location.hash.slice(1);
document.getElementById("greet").innerHTML = "Hello " + name;
</script>
<div id="greet"></div>
innerHTML 是危险 sink,location.hash 是污染 source。
分步
- 浏览器配置为通过 Burp 代理(见 Burp 上手),并开启 DOM Invader(Settings → DOM Invader → Enable)。
- 访问
vulnerable.com/#<img src=x onerror=alert(1)>。 - 在 DOM Invader 面板查看 Sources(来自
location.hash)与 Sinks(流入innerHTML的链路)。 - 触发后观察弹窗/控制台,确认利用成立。
- 修复:改用
textContent而非innerHTML,或对接入值做编码/白名单。
现象与结论
- 弹窗出现即证明:不可信数据经 source 流入危险 sink 即执行——这就是 DOM XSS。
- 治本:按上下文输出编码;避免危险 sink;必要时用 CSP 兜底(见 CSP 篇)。
参考来源:https://owasp.org/www-community/attacks/DOM_Based_XSS