在前端安全领域,DOM型跨站脚本(DOM XSS)的挖掘一直是一个重点。此前我们讨论过DOM XSS的基础原理,其核心在于识别不安全的Source(数据源)与Sink(危险函数)。除了常规的代码审计思路,本文将重点介绍一种在运行时进行主动拦截与分析的动态调试方法。
这种方法的核心在于利用浏览器的开发者工具,在关键的DOM Sink位置设置断点,实时监控并拦截由事件处理程序触发的DOM操作,从而在攻击载荷被执行前捕获它。
下面我们通过一个具体案例来演示此流程。
目标场景分析
假设存在一个页面:https://example.com/?r=intigriti&x=1。
其内部的脚本逻辑大致如下:
- 从当前URL的查询参数中获取
r 的值。
- 从当前URL的查询参数中获取
x 的值。
- 如果
x 参数存在,则执行:location.href = r;
攻击者视角
显然,如果 r 参数的值可被用户完全控制,并被直接赋值给 location.href,就可能引发开放重定向,甚至进一步导致XSS攻击。
动态调试步骤
-
在开发者工具中定位Sink
打开浏览器开发者工具(F12),切换到“Sources”(源代码)面板。使用全局搜索功能(Ctrl+Shift+F),搜索关键词如 location、href 或示例中的特征字符串 intigriti,找到对应的JavaScript代码行。
-
在关键位置设置断点
在找到的疑似危险代码行(例如 if (x) location.href = r;)左侧行号处点击,设置一个断点。
-
触发执行并观察变量
刷新页面或触发相应操作,脚本执行将在断点处暂停。此时,可以在右侧的“Scope”(作用域)面板中查看所有变量的当前值。
你将看到,来自URL的参数 r: "intigriti" 和 x: "1" 已经传入了脚本环境,程序正即将执行危险的Sink调用。
-
注入并验证攻击载荷
这正是动态调试的威力所在:在危险函数执行前,我们能够“截获”用户的输入。
现在,我们将URL参数修改为攻击载荷:https://example.com/?r=javascript:alert(1)&x=1。
再次触发执行,当断点暂停时,观察Scope面板:
r: "javascript:alert(1)"
x: "1"
继续执行(F8),程序将运行 location.href = "javascript:alert(1)";,从而成功触发XSS弹窗。
通过以上步骤,我们不仅验证了漏洞的存在,更清晰地透视了从数据源到危险接收点的完整数据流。这种结合浏览器开发者工具进行动态分析的方法,是挖掘和验证复杂DOM XSS漏洞的利器。
|