记一次bypass前端验证+后端缺陷
2023-5-7 21:17:13 Author: 猪猪谈安全(查看原文) 阅读量:18 收藏

0x00 故事的开始

有人找到我,搞攻防请求支援,当然这种请求那当然要逝世呀

0x01 开始渗透

发了一堆站,有ip有域名,我搞了一晚上啥都没发现,本来想挖挖越权啥的
早上起来用jsFinder扫描,说不定有什么接口泄露呢!结果还真扫到了一堆,一看就看到了一些不得了的东西
getAllUsers、deleteuser等,尝试访问一个接口发现报错

有可能是未授权!赶紧构造一下参数,分析js后需要两个参数

随便构造了一下出现了所有人的信息但是密码全部md5加密了,尝试解密了一下解不出来,size表示显示的字节
接下来要想办法进入后台进行更多的操作,因为构造参数什么的太麻烦了,他的大部分参数都rsa加密过
尝试修改过登入的返回包也没用
改为0表示成功
发现并没有用
如果换做以前的我,我会放弃,但是!我遇到了龙哥(前端代码审计的神)

0x02 开始反转

找到了js判断是否登入后台的地方

while (1)    switch (e.prev = e.next) {        case 0:            if (T.a.start(),                document.title = j(t.m eta.title),                i = O bject(P["a"])(), !i) {                e.next = 9;                sessionStorage.setItem("user", JSON.stringify({ "userRole": "admin" }))                break            }            if ("/login" !== t.path) {                e.next = 9;                break            }            o({                    path: "/"                }),                T.a.done(),                e.next = 28;            break;        case 9:            if (r = p["a"].getters.name, !r) {                e.next = 15;                break            }            s = JSON.parse(sessionStorage.getItem("user")),                "admin" == s.userRole && "/bg_userManage" !== t.path ? (O bject(a["Message"])({                        message: "只有用户管理的权限",                        type: "warning",                        duration: 5e3                    }),                    o({                        path: "/bg_userManage"                    }),                    T.a.done()) : "audit" == s.userRole && "/bg_logManage" !== t.path ? (O bject(a["Message"])({                        message: "只有日志管理的权限",                        type: "warning",                        duration: 5e3                    }),                    o({                        path: "/bg_logManage"                    }),                    T.a.done()) : "user" != s.userRole || "/bg_logManage" !== t.path && "/bg_userManage" !== t.path ? (o(),                    T.a.done()) : (o({                        path: "/404"                    }),                    T.a.done()),                e.next = 28;            break;        case 15:            return e.prev = 15,                e.next = 18,                p["a"].dispatch("user/getInfo");        case 18:            o(),                e.next = 28;            break;        case 21:            return e.prev = 21,                e.t0 = e["catch"](15),                e.next = 25,                p["a"].dispatch("user/resetToken");        case 25:            a["Message"].error(e.t0 || "Has Error"),                o("/login?redirect=".concat(t.path)),                T.a.done();        case 28:            e.next = 31;            break;        case 30:            -1 !== z.indexOf(t.path) ? (T.a.done(),                o()) : (-1 !== n.path.indexOf("/non_visitor") ? o("/dashboard") : o(n.path),                p["a"].commit("user/SET_LOGINWINDOWSTATE"),                T.a.done());        case 31:        case "end":            return e.stop()    }

使用f12断点进行Dbug调试

发现是走到了0

然后赋值了30,因为是while (1)所以跳到了30后面就直接结束了

注意到了9,感觉就是后台页面,我们只需要想办法进到9里面就可以了

尝试重新调试,只需要在他赋值30的完事后在重新赋值覆盖掉他的值

然后不就会跳转到9了?确实,成功跳到了9

第一个if没有进,不管他看下面的s.userRole,而s又等于JSON.parse(sessionStorage.getItem("user"))

直接在这个地方赋值s.userRole="admin"发现报错,请求了龙哥

0x03 白热化阶段

sessionStorage.setItem("user",JSON.stringify({"userRole":"admin"}))

他这里先构造一个userRole=admin的json然后在进行写入本地的sessionStorage?

前面搞定了只需要把path路径改为bg_userManage就可以查看了

成功进来了这个判断:
查看后台:
尝试添加一个账号
果然,rsa加密了,如果我不进后台,拿头给他构造
登入就完事了
第一次登入需要修改密码:
尝试直接修改别的用户的密码:

结果真的可以修改,登入后的页面就不展示了,全是水印根本码不过来

0x04 推荐

推荐浏览器插件reres,可以把网站的js下载到本地进行本地加载(实现修改js的目的,省的dbug修改)
可以直接在0的地方修改
就不用每一次dbug了

0x05 结尾

以后渗透要多看看js,接口什么,实现真正的从0到1
文章来源:奇安信攻防社区(yier)原文地址:https://forum.butian.net/share/198排版:潇湘信安

 点击下方小卡片或扫描下方二维码观看更多技术文章

师傅们点赞、转发、在看就是最大的支持


文章来源: http://mp.weixin.qq.com/s?__biz=MzIyMDAwMjkzNg==&mid=2247510778&idx=1&sn=ccbb2c83f5119d4296d93a3c8ad6a698&chksm=97d045eda0a7ccfbfb1ab134326cdf048cfd838984147f3dbbee15907330a5f65befa9f7ad70#rd
如有侵权请联系:admin#unsafe.sh