背景知识
JavaScript原型链污染
题目
先尝试一下,注册了管理员账号
这里不知道邀请码,所以没有勾选
答案不正确
这里借鉴其他大佬的思路
查看源代码才知道,后端没有数据库,所以sql注入是不可能的
// post请求的路径
app.post('/register', (req, res) => {
let user = JSON.parse(req.body) // 把我们输入的账号密码,从json字符串转成对象
// 判断我们有没有输入账号和密码
if (!user.username || !user.password) {
return res.json({ msg: 'empty username or password', err: true })
}
// 判断账号是否存在总对象的username里,如果相同的username就是重复用户名了
if (users.filter(u => u.username == user.username).length) {
return res.json({ msg: 'username already exists', err: true })
}
// isAdmin是否true 与 邀请码是不是等于这个常量,所以sql注入没用,邀请码是个常量
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 }) // 设置返回信息
})
重新整理思路,进行原型链污染测试
看了这部分源码能判断出,如果这个登陆的对象里,isAdmin的属性是true,那就证明是一个管理员,如果是普通注册的用户,isAdmin属性是false
重新注册然后用bp进行抓包,根据上述思路,直接污染即可
到最后我也没有成功拿到flag,后面复盘一下步骤
待更新
参考学习链接:
【web | CTF】攻防世界 wife_wife_天命传说的博客-CSDN博客
【愚公系列】2023年06月 攻防世界-Web(wife_wife)_愚公搬代码的博客-CSDN博客