文章总结: 本文介绍使用MaR插件自动化加载若依框架动态路由的方法,通过匹配接口特征而非变量名实现通用规则,将手动替换流程压缩为一条规则即可自动拼接隐藏路由。核心思路是从匹配变量名转向匹配业务特征,结合三层正则筛选实现精准替换,有效提升Vue后台系统的渗透测试效率。 综合评分: 85 文章分类: 渗透测试,WEB安全,红队,安全工具,实战经验
《用 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 这个名字,而是去找若依动态路由加载时比较稳定的特征。 整体分三层:
- 初筛定位:先用 MaR 的正则对 JS 文件做一轮扫描,快速定位可能包含路由逻辑的代码片段,缩小分析范围。
- F-regex 模糊逻辑锁定:在初筛基础上,用 F-regex 去模糊匹配动态路由相关逻辑。这一步主要是为了找到类似 dynamicRoutes 的异步路由生成逻辑块,不要求变量名固定。
- 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
这条规则的作用大概是:
- 匹配 JS 文件;
- 找到包含 /system/user-auth 特征的代码片段;
- 提取动态路由变量;
- 自动把它拼接到 Vue Router 的 routes 里。
最终效果就是,不需要手动改 JS,也能直接加载隐藏的动态路由。 Hook 前,只能看到默认加载出来的公共路由。
替换前
替换后,动态路由会被一起拼接进 Vue Router 实例里,原本隐藏的后台菜单、功能页面、接口入口基本都能看到了。
4.结语
这个方法主要是把之前“手动找变量、手动改 JS”的流程自动化了一下。 实际用下来,对若依这类 Vue 后台系统还是比较舒服的,尤其是批量目标场景,可以省很多重复操作。当然,不同站点的打包方式、混淆方式、路由写法都可能有差异,规则不一定百分百通杀,但思路是可以复用的。 如果一时半会儿没法做到真正通用,那就先把流程压缩,把重复操作尽量自动化。 后续如果遇到其他框架,也可以按这个思路继续扩展。
参考文章
Vue新攻击面-动态路由实战狩猎
https://mp.weixin.qq.com/s/lc1q8FZSnCObWa2hJWovTA
感兴趣的师傅可以加我微信交流:AGreatHusband
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Spade sec ArG3 ArG3《《用 MaR 自动加载若依动态路由:从手动替换到一键通杀》》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论