警报函数劫持
在测试网站的跨站脚本(XSS)漏洞时,如果遇到包含大量输入字段或内容重复显示的页面,我通常会使用带有输入名称或唯一标识符的alert弹窗。这样当弹窗触发时,就能快速定位漏洞源。
最近一次测试中遇到了特殊情况:某个页面上触发了与用户名字段相关的alert弹窗,但该页面存在至少8处用户名显示。传统HTML页面可以通过查看源码定位,但这个"现代"页面仅使用HTML模板,所有内容都通过复杂JavaScript动态加载到DOM中。虽然所有用户名显示都经过正确编码且完整呈现,但显然某处存在漏洞。
我本可以简单地告知开发人员存在XSS漏洞,但更希望提供具体细节。受Natalie Silvanovich演讲《The ECMA And The Chakra》启发,我意识到JavaScript中所有内置函数都可被重写。于是决定创建一个自定义alert函数:
|
|
通过Burp或ZAP等工具拦截页面响应,在页面顶部注入这个自定义函数。当XSS触发时,debugger语句会中断执行,通过调用堆栈即可精确定位漏洞位置。
在Chrome中的调试过程:
- debugger触发断点
- 查看调用堆栈追溯alert触发点
- 发现ID为latest_3的元素存在恶意用户名注入
值得注意的是,Firefox的调用堆栈仅显示到onerror调用,无法完整追溯innerHTML操作,因此推荐使用Chrome进行此类测试。
这种技术能在几分钟内准确定位漏洞源,比修改用户名等传统方法更高效。为方便实践,作者还创建了"Alert Lab"演示页面。