前端鉴权跳转:基于onbeforeunload+MaR的通用绕过技巧

admin 2026-01-07 02:35:49 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章提出一种通用前端鉴权绕过方法:在window.onbeforeunload回调中插入debugger断点,利用DevTools调用栈定位跳转函数,再用MaR工具替换为空函数,阻断强制SSO跳转并驻留页面,适用于Vue/React等框架,可快速挖掘未授权接口。 综合评分: 88 文章分类: WEB安全,渗透测试,安全工具,红队,实战经验


cover_image

前端鉴权跳转:基于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

思路

  1. 利用 window.onbeforeunload 事件设置断点 该事件会在页面即将卸载(如跳转、刷新、关闭)前触发。我们在其回调中插入 debugger,即可在跳转发生前中断执行,使页面停留在当前状态。
  2. 通过调用栈(Call Stack)快速定位跳转源头 JavaScript 是单线程同步执行模型。当 location.replace() 等跳转方法被调用时,会压入当前调用栈;随后浏览器触发 onbeforeunload。此时,在 DevTools 的 Call Stack 面板中,“replace” 上方的栈帧,就是直接调用跳转函数的业务代码——即我们要找的跳转逻辑。
  3. 使用 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 的通用绕过技巧》

评论:0   参与:  0