服装网站建设竞争对手调查分析,自己创建外贸公司,室内设计师培训零基础,手机软件开发培训班大佬的wp:WEB#xff1a;Wife_wife-CSDN博客
知识点#xff1a;
prototype是new class 的一个属性#xff0c;即__proto__指向new class 的prototype属性__proto__如果作为json代码解析的话会被当成键名处理#xff0c;但是如果是在类中的话则会被当成子类的原型 如let o…大佬的wp:WEBWife_wife-CSDN博客
知识点
prototype是new class 的一个属性即__proto__指向new class 的prototype属性__proto__如果作为json代码解析的话会被当成键名处理但是如果是在类中的话则会被当成子类的原型 如let osjson.parse({a:nihao,__proto__:{isAdmin:true}}); json.parse相当于创建一个对象解析过程中__proto__作为键名处理相当于os对象有两个键:a和__proto__let os{a:nihao,__proto__:{isAdmin:true}}; 这里__proto__相当于os本身内部键名a和isAdminObject.assign() 利用该函数可以拷贝资源属性的所有键名和值到目标中 Object.assign(target, ...sources) 部分源码分析 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 falsereturn 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 })
}) 源码中需要绕过一个点if (user.isAdmin user.inviteCode ! INVITE_CODE)他只要检测到isAdmintrue就会强制改为false除非给出了正确的inviteCode,而想要拿到真正的flag必须保证isAdmintrue才行下面有一个Object.assign()函数是将源类的键名和值都拷贝到目标中即新建的对象中拷贝过程中__proto__会表示子类原型不作为键名处理真实拷贝键名为isAdmin值为truejson.parse()中__proto__作为键名处理导致后面直接绕过了isAdmin的判断相当于没有该键名默认为false原链污染详解深入理解 JavaScript Prototype 污染攻击 | 离别歌 (leavesongs.com) 污染代码必须在json解析之前输入即__proto__必须作为键名处理才能实现污染攻击留意merge clone 等函数 通关载荷
抓取注册is_Admintrue的数据包构造对应载荷
payload{username:ren2,password:123,__proto__{isAdmin:true},inviteCode:1} 成功注册了账号这里直接登进去就拿到flag了 如果只是注册了普通账号的话只能看到虚假的flag和一张图片没有任何信息 这题可太整人了普通账号进入后我还以为图片中会有一些信息呢做了半天的杂项发现图片就真的是图片呀扫了一下上面的那张小图nilou1.jpg发现竟然是个jphide加密的欸难道有什么隐藏的信息搞了半天找不到密码无法进行解码看了大佬的wp才发现我是彻底被作者给打败了思路被诱导了原来是要绕过isAdmin检测即使知道了也不会基础太差了原链污染的概念也是第一次听总的来说还是有所收获的一边被虐一边学习痛并快乐着
用一张图来表达我的心情 10