题目来源:攻防世界wife_wife
打开题目之后,发现登录界面,然后尝试弱口令,sql二次注入,xss发现都没有,然后看见下面go register(去注册)按钮
成功注册(username和password随便搞)
然后返回登录看一看
发现一个flag,提交
你以为到这结束了吗?nonono!事情没你想的那么简单!
发现提交不了,炸了,这时候有人要问了,主播主播,这可怎么办啊?
小老弟,学网安的没bp吗,抓包看看,有个重点,我们当时注册的时候没有勾选is admin
不勾就能创建勾了建不了,又炸了。哥们儿,你看看你上面呢?让你输code呢。随便输一个抓包
有什么用呢?看着像JS吧,搜一下这是什么渗透攻击漏洞——原型链污染_原型污染漏洞-CSDN博客JavaScript
原型链污染
app.post('/register', (req, res) => {
let user = JSON.parse(req.body)
if (!user.username || !user.password) {
return res.json({ msg: 'empty username or password', err: true })
}
if (users.filter(u => u.username == user.username).length) {
return res.json({ msg: 'username already exists', err: true })
}
if (user.isAdmin && user.inviteCode != INVITE_CODE) {
user.isAdmin = false
return res.json({ msg: 'invalid invite code', err: true })
}
let newUser = Object.assign({}, baseUser, user)
users.push(newUser)
res.json({ msg: 'user created successfully', err: false })
})
let newUser = Object.assign({}, baseUser, user)的作用把baseUser和user的属性合并后拷贝到{}中,即newUser是baseUser和user的集合体。baseUser猜测是user类似父类的东西,user应该就是上面的{"username":"b","password":"b","isAdmin":false}部分了 。
了解这些东西之后,我们就可以构造payload了
{"username":"1",
"password":"1","__proto__":{"isAdmin":true,"inviteCode":"1"}
}
然后提交
我们回到登录界面再登录刚才创建的账号
成功了。