访问某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
收工,点点点半天功能发现所有接口都没有未授权,白干一天。
错了,是好几天,还写了好几天😭