原型链污染[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 = falsereturn 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.hqwc.cn/news/295182.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECMAScript基础入门:从语法到应用

在此之前我以及发布过关于JavaScript基础知识点大家也可以参考 大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏:ajax知识点 🎉欢迎关注…

nodejs+vue+ElementUi摄影作品图片分享工作室管理系统

第1周 2.21~2.27 查阅资料,学习vscode开发平台和vue框架技术 第2周 2.28~3.6 对软件功能需求进行分析, 软件功能模块划分及软件界面设计 第3周 3.7~3.13 撰写并提交毕业设计开题报告、英文资料翻译 第4周 3.14&#xff5…

将html转化成图片

如何将指定html内容转化成图片保存?这个问题很值得深思,实际应用中也很有价值。最直接的想法就是使用canvas,熟悉canvas的同学可以尝试一下。这里不做太多的说明,本文采用html2canvas库来实现。 html2canvas库的使用非常简单&…

2024年pmp考试还有多久啊?怎么备考?

一般来说每年3、6、9、12月考试,一年四次,具体时间以官网通知为准。报考时间提前2个月报名,2023年的最后一次考试时间是11月,已经截止报名了。所以下一次考试就得等到2024年3月了。 想知道怎么备考先来分析一下现在的“新”考纲&…

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

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

KubeSphere金丝雀发布流量分布调节不生效(将所有流量按比例分配给灰度发布版本)

如题 金丝雀发布按照流量比例访问不能生效 1、自制应用生成的路由添加注释: nginx.ingress.kubernetes.io/service-upstream:"true" 2、项目网关开启 3、完成 以上,祝好。

DBA-MySql面试问题及答案-上

文章目录 1.什么是数据库?2.如何查看某个操作的语法?3.MySql的存储引擎有哪些?4.常用的2种存储引擎?6.可以针对表设置引擎吗?如何设置?6.选择合适的存储引擎?7.选择合适的数据类型8.char & varchar9.Mysql字符集10.如何选择…

Linux 安装 Tomcat

1、找到安装包 2、解压缩 tar -xzvf xxx.tar.gz Tomcat 很好安装,已经安装好了 3、启动、关闭Tomcat 进入解压后文件夹之后,两个文件分别是启动和关闭 sh startup.sh // 启动 sh shutdown.sh // 关闭 然后就行了 4、主机连接虚拟机Tomcat 注意这里填写…

当物联网技术遇上圣诞节,会给你带来怎样的商业灵感

智能物联网项目可以将更浓烈的节日气氛融入到千家万户。有市场嗅觉的朋友已经踏上了这种创新与传统相遇的旅程,你可以参考一下他们的点子。 物联网智能照明 借助物联网技术,你可以创建一个智能照明系统,让每一束灯光闪烁出美妙的色彩或图案…

共享购:消费前沿的领导者

在当今这个信息化、互联网高速发展的时代,商业模式也在不断地创新和变革。共享购模式作为一种新型的商业模式,正逐渐受到广泛的关注和追捧。本文将深入探讨共享购模式的核心理念、优势以及如何应用在实际商业场景中,为读者揭示这一模式的巨大…

一起学量化之macd指标

macd指标 1. macd指标定义 MACD的组成要素MACD称为异同移动平均线,是从双指数移动平均线发展而来的。MACD由一根快线、一根慢线、一根0轴线和无数根红绿柱状线组成。 如下图所示,粉色的是快线,也称DIFF线;蓝色的是慢线&#xf…

基于Java SSM框架实现在线课程教育资源考试管理系统项目【项目源码+论文说明】

基于java的SSM框架实现在线课程教育资源考试管理系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线教育资源管理系统,主要的模块包括管理员;个人中心、学生…