前端鉴权绕过技巧-路由守卫

前言

1、什么是前端鉴权?
  是在前端JS代码中判断用户是否有权限访问某个页面下的内容,例如:有一个'/admin'页面但是如果你没有登录,当你访问'/admin'时也许会给你跳转到'/login'页面下或者不加载任何内容显示空白页面。这就是前端鉴权的表现形式。
  
2、为什么要绕过前端鉴权?
  其实绕过前端鉴权发现漏洞的本质还是后端未鉴权,那么我们为什么还要花功夫绕过前端鉴权直接利用'findsomething/雪瞳'等浏览器插件将接口爬下来跑一边不就行了吗?是这样的但是我们时常会遇到接口需要参数难以猜解、构造、参数值利用链复杂的问题(这个案例里会有解释)。如果绕过了前端限制,一些原本不可见的功能点就会出现,那么我们只需要点点点抓包看包就可以完成对接口的测试省去了构造数据包的麻烦。
  
3、如何绕过前端鉴权?
(1)替换响应内容
	- 修改响应状态码,例如:前端判断逻辑为如果返回响应码为 401、403 则跳转到统一登录界面。
	- 修改响应体内容,例如:前端通过请求 'UserInfo' 接口获取用户的身份信息并存储到浏览器缓存中,其中返回的字段有 'isadmin' 或 'roleType' 等相关权限标识字段,而前端判断逻辑为如果'isadmin'不为1就跳转。
	- 修改Js代码内容,例如:Js代码中通过if(e.isLogin)来决定是否跳转,那我们开启抓包工具的替换功能替换为if(!e.isLogin)修改判断代码逻辑。
	适用场景:当前端Js代码不易读懂时,尝试修改响应包数据尝试绕过。
(2)在浏览器开发者模式下,审计前端Js代码在判断身份逻辑语句处打下断点,到控制台修改参数值。
(3)本地替换js文件,修改代码判断逻辑。

演示案例

案例一:

1、通过前端Js发现存在/admin路由,尝试拼接访问会跳转到'lobby'或'login'(一个是登录状态下,一个是未登录情况下说明不仅校验了登录状态还有用户权限)

PixPin_2025-09-25_22-39-24.png
2、绕过方法

  • 方法一(修改响应值):
    查询yakit历史流量发现/api/getUser这个接口很明显返回的内容就是用户的身份信息
    PixPin_2025-09-25_22-34-37.png
    这里发现响应体做了加密,我们直接在加密位置打下断点然后直接调用加解密函数即可(至于怎找到的就不详细解释了,全局搜索关键字、跟踪堆栈都可以)。这里可以关注一下keecth大佬的FakeCryptoJS工具小白也可以轻松加解密,不过这里用到的是国密大佬还没开源出来使用方法可以看我上一篇文章。
    PixPin_2025-09-25_23-09-34.png
    这里也找到了请求/api/getUser接口的代码,通过setUser(user)进行初始化user值所以在这里修改也可以也不需要逆向加解密代码(这个位置是通过adminAccessible定位到的不过整个还是慢慢找的一个过程,所以绕过前端的方式有很多种怎么简单怎么来即可)
    PixPin_2025-09-25_23-18-04.png
  • 方法二(断点修改值):
    通过搜索关键字'user.role'找到了判断用户身份的逻辑代码,断点后在控制台执行user.role=0即可绕过前端限制访问'/admin'这个地方的逻辑为如果用户权限既不是老师又不是管理员就会跳转到'/',再另一处地方又会进行判断决定跳转到'/login'或'/lobby'。

PixPin_2025-09-25_22-56-20.png

  • 结果展示:
    成功进入后台,其中创建功能未授权

PixPin_2025-09-25_23-27-08.png

案例二:

1、直接访问根目录会跳转到SSO认证界面

PixPin_2025-09-25_23-33-08.png
2、绕过方法

  • 方法一(修改响应-修改Js代码逻辑):
    由于会跳转这里在yakit搜索响应关键字Api/Base/Auth/Account/DoLoginAction定位跳转代码,并定位到决定跳转的位置。存在六处存在跳转逻辑的地方我们一个个分析一个个试。
    <1> 这里直接将if (0 === n.length) return i();修改为return使其无论路由有没有权限要求都直接放行。

PixPin_2025-09-26_00-34-09.png
<2> 进一步分析发现状态码为401也会跳转,后面还有几处不重要的就不继续分析了

PixPin_2025-09-26_00-38-25.png
<3> 开启yakit的替换模式进行替换

console\.log\("未授权,请重新登录"\),c\(\);   替换为空
if\(\d{1}===n\.length\)return i\(\);   替换为 return i();

方法二(修改响应体-返回身份信息):
1、上面那个方法想实现还是比较麻烦的,这里有个简单的方法,观察流量包发现请求用户身份信息的接口。

PixPin_2025-09-26_00-57-02.png
2、对应之前的代码,这段代码判断是否有SupperPermission权限,有就会直接通过所有权限验证,不会被重定向。

PixPin_2025-09-26_00-59-46.png
3、所以我们可以拦截/api/base/auth/account/getcurrent数据包将响应体替换为如下。

{
  "userType": null,
  "avatar": null,
  "userId": null,
  "orgId": null,
  "user": null,
  "fullName": null,
  "roles": ["Guest"],
  "permissions": ["SuperPermission"],    //唯一修改的位置,修改为SuperPermission
  "frontendControlPoints": [],
  "backendControlPoints": []
}

4、由之前的分析也知道当响应码为401时还会进行一次重定向的判断,所以我们还是要继续替换

PixPin_2025-09-26_01-04-44.png
进入到的后台。

PixPin_2025-09-26_01-13-31.png
这里用这个案例跟给大家说明一下参数值利用链复杂的问题,进入后台后查看设备监控的过程的一整个接口调用过程:
通过/gettreelist获取parentId -> 通过parentId获取id -> 最后通过将id值赋值给areaIds[0]参数进一步获取到.flv资源
整个过程可以说是比较麻烦的,如果没有前端Js代码去帮我自动调用那么我们很难知道该接口需要哪些参数、以及参数名该从哪来,所以前端鉴权绕过在有时候会帮助我们更好地方便我们发现一些值得关注的位置。

案例三(小程序)

1、这是一个校友会小程序,这种小程序一般需要进行校友认证才可以正常访问里面的功能,否则可能访问一个页面例如展示校友列表、校友搜索等可能泄露校友敏感信息的页面都会在前端校验是否进行校友身份认证。

PixPin_2025-10-09_15-58-47.png
2、另外就算进行了校友验证还是会存在一些隐藏或不容易发现页面(例如:只有管理员才能看到点击访问的页面功能,下面的案例有涉及到)那么我们如何绕过前端限制访问到这些页面呢?我一般通过e0e1-wx获取小程序接口泄露过滤出页面的数据,然后在控制台断点跳转到可能会泄露敏感信息的页面(带有list,info,detail等)自动触发请求接口。
(1)这是泄露信息的接口定义代码
难点1:每次请求数据包都需要带上access_token且access_token不固定
难点2:参与签名的参数为时间戳必须是请求某个接口返回的且所需参数不能少
以上的条件就会导致想要批量测试接口就比较困难,当然如果是一些有价值的接口可以花费时间去测试,那在不知道这个接口是否会泄露用户敏感信息的前提不少师傅可能就放弃了,那有没有简单的方法呢?

PixPin_2025-10-09_18-17-22.png
(2)在微信小程序中强开F12开发者模式,这里可以通过e0e1-wx工具实现,在全局搜索字符串var t=ch("navigateTo",e,!1);打下断点,随意点击小程序功能在页面跳转时就是暂停,此时我们在控制台执行e.url=xxxx选择我们想要去的页面放行就可以跳转到我们想要跳转的页面自动请求接口。

PixPin_2025-10-09_18-36-59.png
自动请求接口/circleUser/list,这里其实还有一个难点就是这个应该是只有管理员能看到的功能(我尝试修改返回数据包的用户身份为已认证管理员绕过前端校验,点击了所有功能点都没有触发这个接口的请求包)

PixPin_2025-10-09_18-43-37.png
那么这个页面/pages/memberList/memberList我是怎么知道的呢?e0e1-wx这款工具会反编译小程序并通过正则匹配接口、敏感信息等数据存储为一个xlsx文件,我们将它爬取的接口(爬取的接口比较杂需要过滤)做个过滤,我们这里需要过滤出页面跳转的数据,我一般使用工具通过语法rule:pages/,page/过滤出来。

PixPin_2025-10-09_18-55-04.png
这款工具会自动过滤重复以及一些静态链接,有需要可以在最后一行自定义规则。过滤后的接口格式还需要统一格式,那么这个格式怎么来呢?可以断点,查看e.url的格式,比如前面需要加上'/'或者后面的.html后缀需要删除之类的。

PixPin_2025-10-09_18-57-47.png
因为有时过滤出的接口比较多,一个个断点跳转也是比较麻烦此时我们可以让ai帮我分析出可能存在漏洞的接口我们在重点去测试。

PixPin_2025-10-09_19-01-04.png
这里也可以发现/pages/allAlumnus/allAlumnus,/pages/alumniData/alumniDat这两个跳转后也是会显示出校友列表但是返回的信息没有敏感信息,这也能证明这是一个管理员才能看到的功能点即使你难道了这个学校的账号也看不到这个功能点,可能简单点了一个校友列表的功能发现没有返回敏感信息就放弃了,但是在其他返回校友列表的接口就会返回用户的敏感信息,本质上还是接口未授权的问题,这里运气比较好需要的参数在代码中比较容易找到,直接测试接口也是可以比较容易找到配合yakit的热加载功能就可以对接口进行fuzz测试,总之选择前端绕过还是直接测试接口怎么简单怎么来吧。

小程序页面跳转(技巧)

选择微信小程序环境

PixPin_2025-11-03_16-13-16.png
利用指令直接跳转 wx.navigateTo({url:"/package/branch/pages/memberList/memberList?branchid="})

温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。

涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。

如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。