原型链污染[JavaScript]

news2025/1/20 1:45:52

一、原型链污染

此类型一般存在以nodejs编写的后端程序当中,其中Express是一个流行的Node.js Web应用程序框架

1.JavaScript

1.1 原理

引入

解释:直接先读代码来理解原型链污染

// 
let jack = {'b':2}
console.log(typeof jack) // 它的类型是obejct
console.log(jack.b)// 2
jack.__proto__.b='3'
bug = {}
console.log(bug.b) // 3 这里我们可以看到,明明bug并没有被赋值,为什么是3呢
// 如果看到这里不清楚为什么bug.b为3 请看下面关于继承的知识

继承

function Son() {
    this.first_name = 'Melania';
}

let son = new Son();
console.log(son.last_name)

解释:通过上面的例子,我们来粗略的解释一下继承,当我们newSon()之后,我们调用了son.last_name,此时在对象son中寻找last_name,无法找出,则在son.__proto__中寻找last_name(下面第一张图片打印了son的信息),如果还是没有找到就从son.__proto__.__proto__中寻找,依次类推,直到__proto__的值为undefined

在这里插入图片描述

解决

解释:有了上面知识的补充我们再来看下面的代码,jack.b值为2,当我们修改了jack.__proto__.b='3'时,相当于我们修改了object隐式的继承关系,也就是说bug此时在其当中并没有找到b,但是在其继承关系里面找到了(如下图),我们可以看到bug.__proto__里面存在b也就是bug.__proto__.b='3'所以我们就得到了bug.b=3

let jack = {'b':2}
console.log(jack.b)// 2
jack.__proto__.b='3'
let bug = {}
console.log(bug.b) // 3 

在这里插入图片描述

疑问:jack.__proto__.b='3'修改了其的值,再新建一个object对象为什么会受其影响
解答:使用 jack.__proto__.b = '3' 这样的代码时,实际上是在修改 jack 对象原型(也就是 Object.prototype)上的属性 b。这是因为jack.__proto__实际上指向的是 jack 对象的原型对象,对于由字面量方式创建的对象,它们的原型就是 Object.prototype

1.2 案例

// post请求的路径
app.post('/register', (req, res) => {
 
    let user = JSON.parse(req.body)  // 把我们输入的账号密码,从json字符串转成对象
 
    // 判断我们有没有输入账号和密码
    if (!user.username || !user.password) {  
        return res.json({ msg: 'empty username or password', err: true })
    }
    // 判断账号是否存在总对象的username里,如果相同的username就是重复用户名了
    if (users.filter(u => u.username == user.username).length) {  
        return res.json({ msg: 'username already exists', err: true })
    }
    // isAdmin是否true 与 邀请码是不是等于这个常量,所以sql注入没用,邀请码是个常量
    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基础用法
      const target = { a: 1, b: 2 };
      const source = { b: 4, c: 5 };
      const result = Object.assign(target, source);
      console.log(result); // { a: 1, b: 4, c: 5 }
      // Object.assign存在的原型链漏洞
      const source = '{ "__proto__":{"b": 4} }'
      const dsource = JSON.parse(source)
      console.log(dsource)
      const result = Object.assign({}, dsource);
      console.log(result)
      console.log(result.b)
      
  • 结果
    • dsource:
      在这里插入图片描述
    • result:
      在这里插入图片描述

题解:由let newUser = Object.assign({}, baseUser, user)我们知道,其将里面三项内容进行了拼接,其中Object.assign存在我们可以输入的user如果我们将其里面的属性恶意构造将造成了原型链污染,在此题中传入的json只要包含{ "__proto__":{"isAdmin": true}我们就会有了Admin权限(因为我们输入的字段并不存在isAdmin所以其会在obejct隐式继承里面找到被我们污染的属性{"isAdmin": true})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1330918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++结合OpenCV:掌握图像基础与处理

本文详细介绍了使用 OpenCV4 进行图像处理的基础知识和操作。内容包括图像的基础概念、色彩空间理解、以及如何在 C 中进行图像读取、显示和基础操作。 1.图像的基本概念与术语 图像表示 在计算机视觉中,图像通常表示为一个二维或三维的数组。二维数组表示灰度图像&…

Linux 磁盘空间占满故障解决方法

故障排查: 使用命令查看磁盘使用量 # 使用人类可读的格式(预设值是不加这个选项的...) df -h # --inodes 列出 inode 资讯,不列出已使用 block df -i # 查看当前目录下各个文件及目录占用空间大小 du -sh / 情况一:一般磁盘空间满了&a…

redis常见数据类型

目录 1.基本全局命令 2.数据结构和内部编码 3.单线程架构 1.基本全局命令 Redis有5种数据结构,但它们都是键值对种的值,对于键来说有一些通用的命令。 KEYS 返回所有满足样式(pattern) 的key。支持如下统配样式。 h?llo 匹配 hello, hallo和hxllo h*llo匹配h…

C++内存管理和模板初阶

C/C内存分布 请看代码: int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)mallo…

1982-2022年的GIMMIS-NDVI数据

GIMMIS-NDVI简单介绍 NDVI 基于先进高分辨率辐射计 (AVHRR) 数据的校正和校准测量,空间分辨率为 0.0833 度,覆盖 1982 年至 2022 年的全球范围。最大 NDVI 值在每月两次合成周期内报告(每月两个值)。该数据集由不同的 AVHRR 传…

SpringIOC之SimpleTimeZoneAwareLocaleContext

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

宽带阻抗匹配的工程实现-第一步,端口驻波仿真

概要 ADS仿真,Matlab仿真,宽带阻抗匹配,smith圆图。 其实阻抗匹配我工作以来经常说,也经常做,但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来,才发现很多东西嘴上说容易&#xf…

【RabbitMQ】RabbitMQ详解(一)

RabbitMQ详解 RabbitMQ介绍四大核心概念RabbitMQ 入门案例Hello RabbitMQ生产者消费者 Work Queues轮询消费 RabbitMQ消息应答与发布自动应答手动应答的方法肯定确认应答否定确认应答拒绝处理该消息恢复到消息队列Multiple的解释消息重新入队手动应答案例 RabbitMQ持久化队列持…

绝对干货-讲讲设计模式之结构型设计模式

经典的23种设计模式种属于结构型设计模式的是装饰模式,适配器模式,代理模式,组合模式,桥接模式,外观模式,享元模式。 如果说创建型设计模式解决的是创建对象的问题,那么结构型模式就是通过类和…

二叉搜索树 --- C++实现

目录 1.二叉搜索树的概念 2.二叉搜索树的操作 3. 二叉树的实现 4.二叉搜索树的应用 5. 二叉树的性能分析 6. 二叉树进阶练习题 1.二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左…

双非本科求职_面试经验_上集

前言 后知后觉开始找实习,也马上进入秋招,写此文一方面是记录一下我的面试经历作为复盘,另一方面也给同样在广州,双非二本的同志一个参考(快来看菜鸟),从而获得一定的动力和自信,毕…

【水文专业词汇】气象水文、水利工程等

水文专业词汇:气象水文、水利工程等 气象水文类水循环过程地区分类 水利工程类跨流域调水工程 参考 气象水文类 水循环过程 中文英文降水/降雨precipitation/rainfall径流runoff/streamflow产汇流runoff generation 地区分类 中文英文雨养作物区rain-fed agricu…

多模态大模型:关于Better Captions那些事儿

Overview 一、ShareGPT4V1.1、Motivation1.2、ShareGPT4V数据集构建1.3、ShareGPT4V-7B模型 一、ShareGPT4V 题目: ShareGPT4V: Improving Large Multi-Modal Models with Better Captions 机构:中科大,上海人工智能实验室 论文: https://arxiv.org/pdf…

少儿编程:从兴趣到升学的关键之路

随着科技的飞速发展,计算机编程已经逐渐渗透到我们生活的方方面面。对于新时代的少儿来说,掌握编程技能不仅可以开拓视野,提高思维能力,还可能成为他们未来升学和就业的重要砝码。6547网将探讨如何将少儿编程从兴趣培养成一种有力…

基于ERC20代币协议实现的去中心化应用平台

文章目录 内容简介设计逻辑ERC20TokenLoanPlatform 合约事件结构体状态变量函数 Remix 运行实现部署相关智能合约存款和取款贷款和还款 源码地址 内容简介 使用 solidity 实现的基于 ERC20 代币协议的借贷款去中心化应用平台(极简版)。实现存款、取款、贷款、还款以及利息计算的…

低代码开发:数字化转型的引擎

引言 在当今数字化时代,组织面临着不断变化的市场需求和技术挑战。数字化转型已成为维持竞争力的关键,而低代码开发正在崭露头角,成为加速创新和数字化转型的有力工具。本文将深入探讨低代码开发的核心概念、优势和应用,以揭示它…

单调栈分类、封装和总结

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 通过枚举最小(最大)值不重复、不遗漏枚举所有子数组 C算法:美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right,[left,right]直接的高度都是maxHeight[i] 可以…

【动态规划算法(dp算法)】之背包问题

文章目录 背包问题动规五部曲一、0-1背包问题 :限制物品不可重复 (要么不选 要么选一个)二、完全背包问题:不限制重复(要么不选 要么可以多选)(完全背包可以转化为0-1背包问题) 动态规划:01背包…

宝塔面板 -- 创建第一个自己的网站

文章目录 前言 一、安装宝塔面板 二、注册宝塔面板 三、安装nginx 四、第一个hello world运行 五、总结 文章目录 前言一、安装宝塔面板二、注册宝塔面板三、安装nginx四、第一个hello world运行五、总结 前言 阿里云最近对在校大学生免费每人赠送一台服务器&#xff0c…

Apache ShenYu 网关JWT认证绕过漏洞 CVE-2021-37580

Apache ShenYu 网关JWT认证绕过漏洞 CVE-2021-37580 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 Apache ShenYu 网关JWT认证绕过漏洞 CVE-2021-37580 已亲自复现) 漏洞名称 漏洞描述 Apache ShenYu是一个异步的,高性能的&#x…