警报函数劫持 - 追踪XSS漏洞的巧妙技巧

本文介绍了一种通过重写JavaScript内置alert函数并结合调试器功能,精确定位跨站脚本(XSS)漏洞源的创新技术,适用于现代动态网页的漏洞测试场景。

警报函数劫持

在测试网站的跨站脚本(XSS)漏洞时,如果遇到包含大量输入字段或内容重复显示的页面,我通常会使用带有输入名称或唯一标识符的alert弹窗。这样当弹窗触发时,就能快速定位漏洞源。

最近一次测试中遇到了特殊情况:某个页面上触发了与用户名字段相关的alert弹窗,但该页面存在至少8处用户名显示。传统HTML页面可以通过查看源码定位,但这个"现代"页面仅使用HTML模板,所有内容都通过复杂JavaScript动态加载到DOM中。虽然所有用户名显示都经过正确编码且完整呈现,但显然某处存在漏洞。

我本可以简单地告知开发人员存在XSS漏洞,但更希望提供具体细节。受Natalie Silvanovich演讲《The ECMA And The Chakra》启发,我意识到JavaScript中所有内置函数都可被重写。于是决定创建一个自定义alert函数:

1
2
3
4
function alert(x) {
    console.log("Custom alert called");
    debugger;
}

通过Burp或ZAP等工具拦截页面响应,在页面顶部注入这个自定义函数。当XSS触发时,debugger语句会中断执行,通过调用堆栈即可精确定位漏洞位置。

在Chrome中的调试过程:

  1. debugger触发断点
  2. 查看调用堆栈追溯alert触发点
  3. 发现ID为latest_3的元素存在恶意用户名注入

值得注意的是,Firefox的调用堆栈仅显示到onerror调用,无法完整追溯innerHTML操作,因此推荐使用Chrome进行此类测试。

这种技术能在几分钟内准确定位漏洞源,比修改用户名等传统方法更高效。为方便实践,作者还创建了"Alert Lab"演示页面。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计