网络作业3

本文详细解释了原型链污染的概念,涉及控制原型对象属性、利用条件(递归合并、路径定义、对象克隆),并通过示例说明如何通过设置`__proto__`实现攻击。
摘要由CSDN通过智能技术生成

如何进行原型链污染

我们首先要知道prototype和_proto_有什么关系?我们来以定义构造函数的方式来定义一个类
在这里插入图片描述
说白了,就是XiLitter.prototype等价于a.proto。就是一个对象的_proto_属性指向所在的类的prototype属性。

原理

如果我们能够控制改变原型对象的属性。比如对于语句object[a][b]=c 我们可以将a设置为_proto_,然后在原型中设置一个属性b,并赋值于c,那么所有继承该原型对象的实例对象都会在本身不拥有b属性的情况下拥有b属性,且值为c。看个例子
在这里插入图片描述
在这里插入图片描述

如何利用

只有在以下三种情况才可以进行原型链污染攻击
1.对象递归合并
2.按路径定义属性
3.对象克隆
在这里插入图片描述

看代码,只要让secert.ctfshow==='36dboy’就能输出flag。最主要的漏洞代码还是copy的一个递归调用函数
在这里插入图片描述
它会for循环遍历object2中的键,如果这个键名在object1和object2中都存在,那么就调用copy函数,否则将object2的key赋值给object1。我们可以控制object2,如果object2中的key设置为_proto_,就可以原型链污染了。我们将object2赋值为{“proto”:{“ctfshow”:“36dboy”}}
因为无论object1还是object2都是有原型的,所以当key为__proto__时,if语句返回true,执行copy函数。又套进去了。。。此时key就为ctfshow了,但是object1中没有ctfshow,所以,if语句返回false,执行赋值语句,则object的原型[ctfshow]就成功赋值为36dboy。

这里有必要多说几句,当__proto__作为键名时,就会进入下一个copy函数,此时就不是object1和object2了,而是object1.__proto__和object2.__proto__了。这就导致了键名__proto__变成了原型了,而ctfshow就成为了原型中的属性,成功污染原型链。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值