当前位置:网站首页 > 技术博客 > 正文

原型链的作用



之前并未有太多了解,最近遇上了一些相关题目,发现原型链污染是其一个常考点,在学习后对其进行了简单总结,希望对正在学习的师傅有所帮助

偏官方一点的解释如下

在中,每个对象都有一个名为的内置属性,它指向该对象的原型。同时,每个函数也都有一个名为 的属性,它是一个对象,包含构造函数的原型对象应该具有的属性和方法。简单来说,属性是指向该对象的原型,而 属性是用于创建该对象的构造函数的原型。

这么说有点抽象,因此这里举个例子来进行说明,首先我们打开谷歌浏览器,F12,切换到控制台,而后我们写入如下代码

 
  

我们实例化出来的对象,它是不能通过访问原型的,但通过就可以实现访问原型,具体代码如下

 
  

在这里插入图片描述

 
  

在这里插入图片描述
对这里的情况需要进行简单说明,我们可以看到在我们进行操作后,即使是内容为空的,调用属性仍存在且值为我们设定的520,这时就达到了一个原型链污染的目的。接下来再说一下可能部分师傅有疑问的点

一、为什么执行过后,我们输出b的值,其值仍为1314

 
  

也就是说,它从自身开始寻找,然后一层一层向上递归寻找,直到找到或是递归到为止,此机制被称为,我们这里的污染的属性是在中,而我们的对象本身就有,所以其值并未改变。

二、为什么新建的值为空的c对象,调用竟然有值而且为我们设定的520

当明白上个问题时,这个问题也就迎刃而解了,我们这里的对象虽然是空的,但的机制就会使它继续递归寻找,此时也就来到了中寻找属性,我们刚刚进行了原型链污染,它的其实就是,而我们进行污染的也是,所以此时它调用的就是我们刚刚污染的属性,所以这也就是为什么

它常见于当存在函数(其功能是将一个数组的内容复制到另一个数组中)的情况下,示例如下

 
  

在这里插入图片描述
这里的话可以看到我们的o3内容为空,但调用b属性也是成功输出了,说明我们刚刚的原型链污染成功了,这里也说一下可能部分师傅有疑问的点。

一、为什么要加JSON.parse,这个函数有什么作用,不加会怎么样?

对于函数

 
  

对于

 
  

详情可见https://www.leavesongs.com/

 
  

我们这里注意到方法,他类似之前示例说的函数,这个方法是可以触发原型链污染的,所以我们这里污染为 就可以了。

 
  
 
  

在这里插入图片描述
而后再安装一下模块即可

 
  
 
  

首先我们这里可以发现存在函数

 
  

这里的含义也是比较简单,即将我们POST提交的信息,通过合并到中,最终我们所有提交的信息都会被保存到session中去,那么存在这个函数的话,说明我们可以进行原型链污染,那么我们污染的参数该是什么呢,我们这个时候看这几行代码

 
  

可以发现其对内容进行了处理,我们跟进这个函数,具体代码可见https://github.com/lodash

image-20230330232013524

 
  

在这里插入图片描述
这里需要注意,我们的需要修改为,这样才能让成为键值而非原型,之所以可以直接这样修改是因为支持根据来解析。

同时,这里之所以不用的原因如下

Function 环境下没有 require 函数,直接使用require('child_process') 会报错,所以我们要用 global.process.mainModule.constructor._load 来代替。

给了一个附件(zip),打开的话是两个文件,具体内容如下

 
  
 
  

方法一

 
  

在这里插入图片描述
成功执行命令,接下来尝试获取

 
  

在这里插入图片描述

方法二

 
  

在这里插入图片描述
成功执行,接下来查看flag

 
  

在这里插入图片描述

和上关的环境相似,这里尝试上关的payload

方法一

 
  

在这里插入图片描述
回显,一眼顶真,这是某些字符串被过滤掉了,这里的话感觉应该是,我们这里可以采用拼接的方法来进行绕过,然后本来的话是,我们这里可以修改为,小知识,因此我们这里尝试一下这个方法

 
  

在这里插入图片描述
同理,查看
在这里插入图片描述




方法二

用上面的第二个函数(spawnSync)可正常执行命令

 
  

在这里插入图片描述

题目给出了源代码,如下所示

 
  

重点在于

 
  

md5的绕过,这里可以采用数组绕过的方式,构造如下语句即可

 
  

在这里插入图片描述

也可以采用这个payload

 
  

在这里插入图片描述

这里给出了源代码,其中的文件内容如下

 
  

这个用到了里的函数,我们这里看一下中文件里的内容

 
  

这个的话就是一个简单的赋值,看这里就能猜出考察点是的原型污染,这里我们如果是,就可以实现一个属性污染,这里要求的条件,如果我们去设置一个,它首先在中寻找,没找到,就会往上继续找,此时就会找到,因为中有,所以此时我们就满足了条件,成功绕过

在这里插入图片描述

方法一

 
  
 
  

如果我们可以自定义query的内容,就可以实现RCE,所以我们这里的话就用原型链污染来修改的值,具体payload如下

 
  

在这里插入图片描述
接下来去访问api接口,从而调用这个
在这里插入图片描述
此时查看我们监听的7777端口,成功反弹shell
在这里插入图片描述










 
  

在这里插入图片描述

方法二

 
  

在这里插入图片描述

此时已成功写入恶意代码,接下来刷新一下界面即可成功反弹shell

这里的话环境和上关类似,但中的内容略有改动,具体如下

 
  

改动点在于,原本是的,所以说也就是原型链多了一层,我们再套一层即可,本来的原型链应该是

 
  

现在变成了

 
  

因此我们这里在上一关的payload基础上多加一个即可,具体payload如下

 
  

在这里插入图片描述
而后POST发包访问接口
在这里插入图片描述
查看是否成功反弹shell
在这里插入图片描述










这里缺少了,这样的话就说明没法再去用之前的方法来做了,但考虑到这里的,所以这里的话应该是用ejs来进行反弹shell的,尝试用此payload进行反弹shell,与之前payload相似,多套一层,具体payload如下

 
  
 
  

在这里插入图片描述

的原型链污染,参考链接https://xz.aliyun.com/t/7025,由于node.js了解较少,所以这里参考其他师傅的payload进行尝试,等学会node.js再对具体代码进行分析,payload如下

 
  

在这里插入图片描述
接下来刷新界面,查看监vps在这里插入图片描述
成功反弹shell,接下来查看即可
在这里插入图片描述







源码如下

 
  

可以看到我们这里需要满足三个条件

 
  

我们这里平常的话如果没有过滤的话,直接这样写payload就可以

 
  

但这里存在过滤,是,所以我们这里不能再用逗号,我们这里可以使用来代替它,但此时发现还不行,这是因为这里,这个的编码是,而它和c连起来,此时就是,此时就有了,所以不满足条件,因此我们这里需要对c进行一次URL编码,所以最终payload是

 
  

                            

  • 上一篇: 神秘f组
  • 下一篇: html中button按钮用法
  • 版权声明


    相关文章:

  • 神秘f组2025-08-13 19:01:07
  • 栅格式布局2025-08-13 19:01:07
  • okhttp架构2025-08-13 19:01:07
  • 阅读器和平板看电子书哪个好2025-08-13 19:01:07
  • linux发行版包括2025-08-13 19:01:07
  • html中button按钮用法2025-08-13 19:01:07
  • sar指标使用技巧口诀2025-08-13 19:01:07
  • 序列 oracle2025-08-13 19:01:07
  • hashmap底层实现原理扩容2025-08-13 19:01:07
  • 黑客应用免费下载2025-08-13 19:01:07