《用MaR自动加载若依动态路由:从手动替换到一键通杀》

admin 2026-05-01 05:14:17 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍使用MaR插件自动化加载若依框架动态路由的方法,通过匹配接口特征而非变量名实现通用规则,将手动替换流程压缩为一条规则即可自动拼接隐藏路由。核心思路是从匹配变量名转向匹配业务特征,结合三层正则筛选实现精准替换,有效提升Vue后台系统的渗透测试效率。 综合评分: 85 文章分类: 渗透测试,WEB安全,红队,安全工具,实战经验


cover_image

《用 MaR 自动加载若依动态路由:从手动替换到一键通杀》

ArG3 ArG3

Spade sec

2026年4月29日 12:34 北京

在小说阅读器读本章

去阅读

前言

作者:ArG3

看了月和 0xsdeo 师傅的文章,思路确实打开了。不过实操下来,发现手动替换 JS 加载动态路由这招,在打批量目标的时候还是太费时间。最开始我想用 HaE 插件配合正则来偷懒,只提取动态路由的数组名。但 Vue 站点的写法实在太杂,我就尝试了若依框架的通用规则。开始是“HaE匹配 + 手动替换”,虽然能省点事,但还不够爽。后来 MaR 插件更新支持了动态提取替换——彻底通了。现在一条规则基本能通杀若依的动态路由,真正做到了”Match and Replace”一个插件就全搞定,也是借此机会成为了 MaR 的第三作者。

工具地址

MaR:https://github.com/gh0stkey/MaR

AntiDebug_Breaker:https://github.com/0xsdeo/AntiDebug_Breaker

前置知识:Vue新攻击面-动态路由实战狩猎

Spade sec 公众号文章: Web安全

1. 通过 JS 定位动态路由数组名

正常情况下,不做 hook 时,只能看到已经加载出来的路由。

分析 JS 后可以看到,未加载的动态路由变量名是:t.dynamicRoutes 这些路由在 AntiDebug_Breaker 获取路由实例时还没有被真正加载,所以直接看路由实例是看不到的。

2.使用MaR对Vue Router 实例化代码进行替换

原始代码

 t.default = new s.default({
            mode: "hash",
            scrollBehavior: function() {
                return {
                    y: 0
                }
            },
            routes: l.concat(t.dynamicRoutes)
        })
    },

分析后可以知道,l 是公共路由变量。

所以我们只需要把:

routes: l

替换成

routes: l.concat(t.dynamicRoutes)

也就是在 Vue Router 初始化时,顺手把动态路由也拼进去。 这样前端就能直接看到原本没加载出来的路由了。

3.衍生思维

通过对多个混淆场景下的若依站点进行分析,单纯靠变量名匹配的话,很容易翻车。比如有的站还是 dynamicRoutes,有的站变量名被压缩成 n、t,甚至是随机变量名。

所以这里的核心思路要从:

匹配变量名

转变成:

匹配业务特征

也就是说,不要死盯着 dynamicRoutes 这个名字,而是去找若依动态路由加载时比较稳定的特征。 整体分三层:

  1. 初筛定位:先用 MaR 的正则对 JS 文件做一轮扫描,快速定位可能包含路由逻辑的代码片段,缩小分析范围。
  2. F-regex 模糊逻辑锁定:在初筛基础上,用 F-regex 去模糊匹配动态路由相关逻辑。这一步主要是为了找到类似 dynamicRoutes 的异步路由生成逻辑块,不要求变量名固定。
  3. S-regex 精准变量提取:最后再用 S-regex 对命中的代码块做细粒度提取,拿到真正承载路由数据的变量名。 比如
routers
routes
n
t

或者其他混淆后的变量。

4. 为什么能通用?

若依在获取动态路由时,通常会请求固定接口,例如:

/system/user-auth

所以我们可以围绕这个接口特征去写规则,当然这里只是参考,如果有其他更好的方法去定位动态路由也可以自行替换。 简单来说就是:

不匹配变量名,而是匹配接口特征,再反推变量。

比如通过匹配:

.*/system/user-auth

或者类似的字符串拼接结构,向前回溯找到对应的赋值变量。

5. MaR 规则示例

这里用 MaR 的 {1}标识符引用捕获组,实现动态替换。

  - name:RuoYiDynamicRouting
    loaded:true
    c_scope:requesturi
    relationship:Matches
    condition:.*?\.js
    c_regex:true
    e_scope:responsebody
    f_regex:([a-zA-Z_$][a-zA-Z0-9_$]{0,30}=[^,]{0,200})/system/user-auth
    s_regex:([a-zA-Z_$][a-zA-Z0-9_$]*(?:.[a-zA-Z_$][a-zA-Z0-9_$]*)*)=\[
    m_scope:responsebody
    match:([,}]|\s)(routes:)([a-zA-Z_$][\w$]*)([,}\s])
    replace:$1$2$3.concat({1})$4
    m_regex:true

这条规则的作用大概是:

  1. 匹配 JS 文件;
  2. 找到包含 /system/user-auth 特征的代码片段;
  3. 提取动态路由变量;
  4. 自动把它拼接到 Vue Router 的 routes 里。

最终效果就是,不需要手动改 JS,也能直接加载隐藏的动态路由。 Hook 前,只能看到默认加载出来的公共路由。

替换前

替换后,动态路由会被一起拼接进 Vue Router 实例里,原本隐藏的后台菜单、功能页面、接口入口基本都能看到了。

4.结语 这个方法主要是把之前“手动找变量、手动改 JS”的流程自动化了一下。 实际用下来,对若依这类 Vue 后台系统还是比较舒服的,尤其是批量目标场景,可以省很多重复操作。当然,不同站点的打包方式、混淆方式、路由写法都可能有差异,规则不一定百分百通杀,但思路是可以复用的。 如果一时半会儿没法做到真正通用,那就先把流程压缩,把重复操作尽量自动化。 后续如果遇到其他框架,也可以按这个思路继续扩展。

参考文章

Vue新攻击面-动态路由实战狩猎

https://mp.weixin.qq.com/s/lc1q8FZSnCObWa2hJWovTA

感兴趣的师傅可以加我微信交流:AGreatHusband


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Spade sec ArG3 ArG3《《用 MaR 自动加载若依动态路由:从手动替换到一键通杀》》

评论:0   参与:  0