【攻防世界】wife_wife

原型链污染

源码 

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}部分了 。

Object.assign 这个方法是可以触发原型链污染的,然后污染 __proto__.isAdmin 为 true 就可以了。在注册页面,构造payload

原型链污染不太准确的理解就是“父类影响子类”,一个子类继承于父类后,父类有什么属性子类就有什么属性。比如这里我们的注册信息data按照json的形式传入,JSON.parse后得到一个对象。这个对象有3个键名,username,password和__proto__。比较容易搞混的地方来了,这个__proto__是键名,单纯是个键名,值为{“isAdmin”:true},而不是类的原型对象prototype。这点很重要,如果我们把测试代码稍微修改一下: 

let baseUser={};
//let data='{"username":"e","password":"e","__proto__":{"isAdmin":true}}';
//let user= JSON.parse(data);
let user={"username":"e","password":"e","__proto__":{"isAdmin":true}};
console.log(user);
console.log(user.isAdmin); //输出true,导致进入下面的if语句将isAdmin强行改为false
let INVITE_CODE="whatever";
if (user.isAdmin && user.inviteCode != INVITE_CODE) {
        user.isAdmin = false
}
let newUser = Object.assign({}, baseUser, user) //那这里的原型链污染也没用了,子类后定义的属性值会覆盖父类的
console.log(newUser.isAdmin);

console.log(user.isAdmin);尝试读取isAdmin属性时会顺着上去找父类的,得到true,进入if语句赋值就没用了。总之就是记住,原型链污染需要在JSON解析的情况下进行 

 

wife_wife ctf-CSDN博客 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 18:40:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 18:40:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 18:40:01       87 阅读
  4. Python语言-面向对象

    2024-04-10 18:40:01       96 阅读

热门阅读

  1. gocron定时任务管理

    2024-04-10 18:40:01       39 阅读
  2. 1.Go的基本语法 - 函数、数组、接口

    2024-04-10 18:40:01       44 阅读
  3. 2024.4.2力扣每日一题——所有可能的真二叉树

    2024-04-10 18:40:01       34 阅读
  4. libcurl上手笔记-HTTP方法 GET、POST、PUT、DELETE

    2024-04-10 18:40:01       44 阅读
  5. 渗透测试步骤

    2024-04-10 18:40:01       38 阅读
  6. 基于R语言的选举数据的模型建立与预测分析

    2024-04-10 18:40:01       36 阅读
  7. How to find which Azure Private DNS Zone is associated with VNet

    2024-04-10 18:40:01       36 阅读
  8. 为什么pdf拆分出几页之后大小几乎没有变化

    2024-04-10 18:40:01       41 阅读
  9. c++ 函数进阶

    2024-04-10 18:40:01       34 阅读
  10. 响应---

    2024-04-10 18:40:01       35 阅读