原型链污染[JavaScript]

一、原型链污染

此类型一般存在以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})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文掌握分布式锁:Mysql/Redis/Zookeeper实现

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

React 中的 ref 和 refs:解锁更多可能性(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

安卓13上手势导航失效、手机卡死问题

问题描述&#xff1a;打开我们开发的app后&#xff0c;手势导航无法退回、无法回到桌面、无法切换应用。 使用设备&#xff1a;小米手机、MI14,、安卓13 未适配安卓13安卓x的情况下&#xff0c;检查自己的 AndroidManifest 文件&#xff0c;过滤器是否设置了 <category a…

信息安全等级保护的定义与意义

目录 前言 信息安全等级保护定义 广义上 狭义上 技术和管理 信息安全的基本要素 信息安全等级保护的意义 当前形式 形式严峻 国家安全 三个基本一个根本 预期目标 最终效果 实际意义 前言 信息安全等级保护是对信息和信息载体按照重要性等级分级进行保护的一种…

HTML5+CSS3+Vue小实例:彩带圣诞树

实例:彩带圣诞树 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

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

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

git入门指南:新手快速上手git(Linux环境如何使用git)

目录 前言 1. 什么是git&#xff1f; 2. git版本控制器 3. git在Linux中的使用 安装git 4. git三板斧 第一招&#xff1a;add 第二招&#xff1a;commit 第三招&#xff1a;push 5. 执行状态 6. 删除 总结 前言 Linux的基本开发工具介绍完毕&#xff0c;接下来介绍一…

游戏开发公司需要具备哪些能力?

中懿游游戏软件开发,游戏开发行业的竞争日益激烈&#xff0c;成功的游戏开发公司需要具备多方面的能力&#xff0c;从技术创新到市场推广&#xff0c;再到团队协作。以下是构建成功游戏开发公司所需的关键能力概览&#xff1a; 1. 游戏开发技术&#xff1a; 在技术方面&#…

【flink】状态清理策略(TTL)

flink的keyed state是有有效期(TTL)的&#xff0c;使用和说明在官网描述的篇幅也比较多&#xff0c;对于三种清理策略没有进行横向对比得很清晰。 全量快照清理(FULL_STATE_SCAN_SNAPSHOT)增量清理(INCREMENTAL_CLEANUP)rocksdb压缩清理(ROCKSDB_COMPACTION_FILTER) 注意&…

MySQL8.0聚合函数+over()函数

1、数据表内容为&#xff1a; CREATE TABLE chapter11 (shopname VARCHAR(255) NULL,sales VARCHAR(255) NULL,sale_date VARCHAR(255) NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;INSERT INTO chapter11 (shopname, sales, sale_date) VALUES(A…

Linux 系统调用

系统调用 在现代操作系统中&#xff0c;内核提供了用户进程与内核进行交互的一组接口。 这些接口让应用程序受限地访问硬件设备&#xff0c;提供了创建新进程并与已有进程进行通信的机制&#xff0c;也提供了申请操作系统其他资源的能力。 应用程序发出各种请求&#xff0c;而…

WEB渗透—PHP反序列化(八)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

持续集成交付CICD:Linux 部署 Jira 9.12.1

目录 一、实验 1.环境 2.K8S master节点部署Jira 3.Jira 初始化设置 4.Jira 使用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注master1K8S master节点1.20.6192.168.204.180 jenkins slave &#xff08;从节点&#xff09; jira9.12.1…

【强化学习】循序渐进讲解Deep Q-Networks(DQN)

文章目录 1 Q-learning与Deep Q-learning2 DQN的结构组成3 DQN创新技术&#xff08;重点&#xff09;3.1 Experience Replay&#xff08;经验回放&#xff09;3.2 Fixed Q-Target&#xff08;固定Q目标&#xff09;3.3 Double Deep Q-Learning&#xff08;双重深度Q学习方法&am…

momentum2靶机

文章妙语 遇事不决&#xff0c;可问春风&#xff1b; 春风不语&#xff0c;遵循己心。 文章目录 文章妙语前言一、信息收集1.IP地址扫描2.端口扫描3.目录扫描 二&#xff0c;漏洞发现分析代码bp爆破1.生成字典2.生成恶意shell.php2.抓包 三&#xff0c;漏洞利用1.反弹shell 四…

pytorch张量的创建

张量的创建 张量&#xff08;Tensors&#xff09;类似于NumPy的ndarrays &#xff0c;但张量可以在GPU上进行计算。从本质上来说&#xff0c;PyTorch是一个处理张量的库。一个张量是一个数字、向量、矩阵或任何n维数组。 import torch import numpy torch.manual_seed(7) # 固…

深圳鼎信|输电线路防山火视频监控预警装置:森林火灾来袭,安全不留白!

受线路走廊制约和环保要求影响&#xff0c;输电线路大多建立在高山上&#xff0c;不仅可以减少地面障碍物和人类活动的干扰&#xff0c;还能提高线路的抗灾能力和可靠性。但同时也会面临其它的难题&#xff0c;例如森林火灾预防。今天&#xff0c;深圳鼎信智慧将从不同角度分析…

随机森林 2(决策树)

通过 随机森林 1 的介绍&#xff0c;相信大家对随机森林都有了一个初步的认知&#xff0c;知道了随机和森林分别指的是什么&#xff0c;以及决策树根据什么选择内部节点。本文将会从森林深入到树&#xff0c;去看一下决策树是如何构建的。网上很多文章都讲了决策树如何构建&…

幺模矩阵-线性规划的整数解特性

百度百科:幺模矩阵 在线性规划问题中&#xff0c;如果A为幺模矩阵&#xff0c;那么该问题具有最优整数解特性。也就是说使用单纯形法进行求解&#xff0c;得到的解即为整数解。无需再特定使用整数规划方法。 m i n c T x s . t . { A x ≥ b x ≥ 0 \begin{align*} min \quad…

Java动态代理Proxy(通俗易懂,一学就会)

为什么需要代理&#xff1f;代理长什么样&#xff1f; 代理实现案例代码 1.中介接口&#xff08;约束代理方法&#xff09; 2.BigStar&#xff08;被代理&#xff09; 实现接口方法 3.代理工具类 invoke方法中的proxy表示代理对象&#xff0c;method表示代理获取到调用的方法对…