访问某VUE站点,发现直接重定向要求从飞书登陆,立马抓包丢掉请求了。
使用JS替换在本地调试修改尝试绕过
直接全局搜索跳转到url找到原因, 把这个注释掉并保存,重新刷新进入。
接着又发现无限重定向到主页,然后打开console发现最后一个提示是401,仅接着又重现location到到根目录了。
在控制台看见最后的请求是api/user/info,搜一下是什么发起的
e.headers.common.Authorization = "Bearer " + Object(o["b"])(),
e), e=>{
console.log(e),
Promise.reject(e)
}
),
c.interceptors.response.use(e=>(e.request.responseType,
e.data), e=>(401 === e.response.status && (Object(o["c"])("code"),
setTimeout(()=>{
location.reload()
}
, 4e3)),
console.log("err" + e),
Promise.reject(e))),
原来是有一个判断401的定时任务执行 location.reload()
直接注释掉
ok不执行reload()了,但是也不继续走了,没有画面了😭
既然401会reload() 那么200 会发生什么?我这里直接点击at XMLHttoRequest.m 的报错来到请求发出处对status code 进行修改,当然也可以直接选择使用burp替换。
我选择直接把status写得200
a = {
data: i,
status: 200,
statusText: h.statusText,
headers: r,
config: t,
request: h
};
console依然是401的报错,但是多了一条别的报错,说明代码继续往下走了。
提示TypeError: Cannot read properties of undefined (reading 'staff_id')说明无法读取t.profile对象的staff_id属性。
断点查看一下t
应该是在请求认证接口返回的一些数据结构,但是我并没修改返回的response,只是对status code 做了修改,其他的数据哪里来的呢?
向上回溯发现一些地方也是做了处理。
当然这些都不重要,即使有了数据也不一定是正确的,后端如果做了鉴权,伪造的数据是肯定无法通过的。我们的目的是欺骗前端。
先简单的统统杀掉staff_id, 就是那里报错删那里,最后什么name/avatar之类的报错都删除了,只留下了e.profile
终于出画面了,也出新错误了😭
又是提示Cannot read properties of undefined (reading 'xxxx')
看e.data的规律应该是从某个接口的responses中读取公司和部门列表做展示,这里依然是直接做删除处理✖️
结果如何请看VCR🎬
好了不报错了,收工。忙活了半天发现做了个空页面展示。
即便是没有公司部门数据也不至于什么功能都没有展示啊???肯定在哪里还有逻辑判断 下个断点往回追一追看(其实上面某处已经出现过了)。
最后发现在create方法下有admin相关的字眼
methods: {
loadRoute(e) {
var t = !0;
e.forEach(e=>{
("recruit" === e || this.$store.state.user.staffAuth.includes("admin") || this.$store.state.user.staffAuth.includes(e)) && (t = !1)
}
),
t && (window.location.href = "/#/home")
}
}
在这里有一个路由守卫判断权限,遍历判断权限是否为e是否为recruit或staffAuth包含admin,如果条件成立则设置 t = !1
结果修改完发现依然是空白展示,压根没走到t = !1这个地方判断。
如何仔细阅读代码其实根本不用走到这一步就能展示路由了,写到到这的原因完全是因为补控制台的报错🤣
应该是在请求认证接口返回的一些数据结构,但是我并没修改返回的
response,只是对status code做了修改,其他的数据那里来的呢?向上回溯发现一些地方也是做了处理。
让我们回到上面👆这一部分重新开始。
首先这里异步获取了h["a"].state.user.staffAuth用户权限的属性,并存储在e中,接着访问了 /permission/generateRoute/ 路由生成接口将用户权限传入。
最后执行addRoutes(e) ,所以这里应该是关键点,判断权限并添加路由。
断点得到了一个存储了路由信息的数组,并且有个"hidden":true属性,这应该就是控制展示的参数。这里选择继续深入,看看是哪里判断hidden是false还是true的。
这里需要了解VUE相关知识,.dispatch 用作于分发 action , 一直跟进到原生的vuex.min.js 中拦截,看看这个 /permission/generateRoute/绑定的是什么action
最后得到这么一个action : s 的东西, s命名为generateRoutes
断点发现r路由信息是由i(n["a"], t); 返回的
跟进i 发现组建设置hidden的判断点("recruit" === t || a.includes(t)) && (e.hidden = !1), a.includes("admin") && "other" !== t && (e.hidden = !1)
直接注释掉设置为 e.hidden =!1