之前并未有太多了解,最近遇上了一些相关题目,发现原型链污染是其一个常考点,在学习后对其进行了简单总结,希望对正在学习的师傅有所帮助
偏官方一点的解释如下
在中,每个对象都有一个名为的内置属性,它指向该对象的原型。同时,每个函数也都有一个名为 的属性,它是一个对象,包含构造函数的原型对象应该具有的属性和方法。简单来说,属性是指向该对象的原型,而 属性是用于创建该对象的构造函数的原型。
这么说有点抽象,因此这里举个例子来进行说明,首先我们打开谷歌浏览器,F12,切换到控制台,而后我们写入如下代码
我们实例化出来的对象,它是不能通过访问原型的,但通过就可以实现访问原型,具体代码如下


对这里的情况需要进行简单说明,我们可以看到在我们进行操作后,即使是内容为空的,调用属性仍存在且值为我们设定的520,这时就达到了一个原型链污染的目的。接下来再说一下可能部分师傅有疑问的点
一、为什么执行过后,我们输出b的值,其值仍为1314
也就是说,它从自身开始寻找,然后一层一层向上递归寻找,直到找到或是递归到为止,此机制被称为,我们这里的污染的属性是在中,而我们的对象本身就有,所以其值并未改变。
二、为什么新建的值为空的c对象,调用竟然有值而且为我们设定的520
当明白上个问题时,这个问题也就迎刃而解了,我们这里的对象虽然是空的,但的机制就会使它继续递归寻找,此时也就来到了中寻找属性,我们刚刚进行了原型链污染,它的其实就是,而我们进行污染的也是,所以此时它调用的就是我们刚刚污染的属性,所以这也就是为什么
它常见于当存在函数(其功能是将一个数组的内容复制到另一个数组中)的情况下,示例如下

这里的话可以看到我们的o3内容为空,但调用b属性也是成功输出了,说明我们刚刚的原型链污染成功了,这里也说一下可能部分师傅有疑问的点。
一、为什么要加JSON.parse,这个函数有什么作用,不加会怎么样?
对于函数
对于
详情可见https://www.leavesongs.com/
我们这里注意到方法,他类似之前示例说的函数,这个方法是可以触发原型链污染的,所以我们这里污染为 就可以了。

而后再安装一下模块即可
首先我们这里可以发现存在函数
这里的含义也是比较简单,即将我们POST提交的信息,通过合并到中,最终我们所有提交的信息都会被保存到session中去,那么存在这个函数的话,说明我们可以进行原型链污染,那么我们污染的参数该是什么呢,我们这个时候看这几行代码
可以发现其对内容进行了处理,我们跟进这个函数,具体代码可见https://github.com/lodash


这里需要注意,我们的需要修改为,这样才能让成为键值而非原型,之所以可以直接这样修改是因为支持根据来解析。
同时,这里之所以不用的原因如下
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是
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/7582.html