文章总结: 文章提出一种通用前端鉴权绕过方法:在window.onbeforeunload回调中插入debugger断点,利用DevTools调用栈定位跳转函数,再用MaR工具替换为空函数,阻断强制SSO跳转并驻留页面,适用于Vue/React等框架,可快速挖掘未授权接口。 综合评分: 88 文章分类: WEB安全,渗透测试,安全工具,红队,实战经验
前端鉴权跳转:基于onbeforeunload + MaR 的通用绕过技巧
原创
ArG3
牛马安全
2026年1月6日 14:21 江苏
特此说明:
-
本文内容仅供技术交流与学习参考;
-
任何因使用本文所述方法或思路而引发的法律后果,均由使用者自行承担;
-
欢迎转载,但严禁任何形式的抄袭或篡改。
作者:ArG3
场景
在测试某网站时,发现其强制跳转至 SSO(统一身份认证)登录页,而我希望停留在当前页面,以便进一步探测未授权接口或功能。受 Key 师傅在 HACK THE WORLD 知识星球中分享的《MaR 之 VUE 前端通杀鉴权绕过思路》启发,注意到其中利用 MaR 工具进行匹配与替换 的技巧非常高效。因此,本文将分享一种通用方法:如何通过调试手段定位并阻断前端强制跳转逻辑,从而稳定停留在目标页面。
工具
- MaR(Match and Replace)- https://github.com/gh0stkey/MaR
- Anti-Debug Breaker(用于绕过反调试)- https://github.com/0xsdeo/AntiDebug_Breaker
思路
- 利用
window.onbeforeunload事件设置断点 该事件会在页面即将卸载(如跳转、刷新、关闭)前触发。我们在其回调中插入debugger,即可在跳转发生前中断执行,使页面停留在当前状态。 - 通过调用栈(Call Stack)快速定位跳转源头
JavaScript 是单线程同步执行模型。当
location.replace()等跳转方法被调用时,会压入当前调用栈;随后浏览器触发onbeforeunload。此时,在 DevTools 的 Call Stack 面板中,“replace” 上方的栈帧,就是直接调用跳转函数的业务代码——即我们要找的跳转逻辑。 - 使用 MaR 替换跳转函数,实现持久化驻留 定位到跳转函数后,可通过 MaR 将其替换为空函数或自定义逻辑(如仅打印日志),从而彻底阻止跳转,使页面长期保持在当前状态,便于后续接口探测、参数分析及未授权访问测试。
下面我来详细解释 为什么这个方法有效,以及 “上一个栈帧”为何就是跳转代码。
背景:onbeforeunload 是什么?
window.onbeforeunload是浏览器提供的一个事件,在页面即将卸载(跳转、关闭、刷新)前触发。
window.onbeforeunload = function() {
debugger; // ← 在这里打断点
return false;
};
当任何导致页面跳转的行为发生时(如 location.replace()、点击链接、表单提交等),浏览器会先执行 onbeforeunload 回调,然后再真正跳转。
#
1
为什么“上一个栈帧”就是跳转逻辑?
关键在于:JavaScript 是单线程 + 同步调用栈(Call Stack)模型。
举个例子:
假设你的代码中有:
function doRedirect() {
window.location.replace("https://example.com"); // ← 跳转发生在这里
}
function handleClick() {
doRedirect();
}
当你点击按钮触发 handleClick(),调用栈是:
handleClick()
└─ doRedirect()
└─ location.replace(...)
└─ 浏览器内部 → 触发 beforeunload 事件
└─ 执行 window.onbeforeunload 回调
└─ debugger(你下的断点)
此时你在 DevTools 的 Call Stack(调用栈)面板 中会看到:
▶ onbeforeunload (你的断点处)
▶ (anonymous) ← 浏览器内部触发
▶ replace ← location.replace 调用
▶ doRedirect ← ← ← 这就是你要找的“跳转逻辑所在函数”
▶ handleClick
...
因此,replace 的上一帧(doRedirect)正是调用跳转的函数。此方法无需阅读混淆代码,秒级定位,极为高效。
2
案例
当网站触发跳转时,会执行 onbeforeunload 回调中的 debugger 语句,从而在开发者工具中自动断点。此时可通过调用栈(Call Stack)快速定位跳转逻辑所在的 JavaScript 代码位置,进而手动替换或禁用该跳转函数,实现绕过。
这一块就是跳转逻辑
随后使用 MaR将该跳转函数替换为无操作逻辑(如空函数或日志输出),从而永久阻断跳转行为。
替换完成后,页面将不再执行跳转逻辑,从而稳定停留在当前页面。
结语
借助 MaR 这类强大的前端代码匹配与替换工具,我们可以灵活地:
- 阻断鉴权跳转
- 结合 js 思路固化页面保留敏感按钮与接口上下文
- 绑定参数(如 token、appId)
- 深入挖掘未授权访问漏洞
这种方法不仅适用于 Vue 项目,对 React、Angular 或任意前端框架均具有通用性,是前端安全测试中的利器。
最后:MaR 的威力,取决于你对业务逻辑及请求/响应的理解深度。
参考信息
https://github.com/JSREI/page-redirect-code-location-hook
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:牛马安全 ArG3《前端鉴权跳转:基于onbeforeunload + MaR 的通用绕过技巧》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论