目錄
1.什么是原型鏈污染
2.原型鏈三屬性
1)prototype
2)constructor
3)__proto__
4)原型鏈三屬性之間關(guān)系?
3.JavaScript原型鏈繼承
1)分析
2)總結(jié)
3)運(yùn)行結(jié)果?
?4.原型鏈污染簡(jiǎn)單實(shí)驗(yàn)
1)實(shí)驗(yàn)一
?2)實(shí)驗(yàn)2
1.什么是原型鏈污染
原型鏈污染(Prototype Pollution)是一種web應(yīng)用程序中常見(jiàn)的安全漏洞,主要影響使用JavaScript的應(yīng)用程序。它是一種攻擊技術(shù),通過(guò)修改JavaScript對(duì)象的原型鏈,來(lái)實(shí)現(xiàn)對(duì)應(yīng)用程序的非法操作和控制。
JavaScript中的對(duì)象是通過(guò)原型鏈進(jìn)行繼承的。每個(gè)對(duì)象都有一個(gè)指向其原型的鏈接,它允許對(duì)象從其原型中繼承屬性和方法。當(dāng)JavaScript代碼在處理輸入時(shí),如果不適當(dāng)?shù)卦试S用戶控制原型鏈上的屬性,攻擊者就可以操縱原型鏈,并在目標(biāo)對(duì)象上添加、修改或刪除屬性。
攻擊者利用原型鏈污染可以實(shí)現(xiàn)多種攻擊,包括但不限于:
- 修改對(duì)象的原型,從而覆蓋或擴(kuò)展原有屬性和方法,導(dǎo)致應(yīng)用程序的意外行為或漏洞。
- 污染全局對(duì)象的原型,導(dǎo)致全局范圍內(nèi)的異常行為,可能導(dǎo)致系統(tǒng)崩潰或敏感信息泄露。
- 在原型鏈上添加惡意方法或?qū)傩?,用于劫持或篡改?yīng)用程序的邏輯。
- 繞過(guò)應(yīng)用程序的安全控制,獲取未授權(quán)的訪問(wèn)權(quán)限。
原型鏈污染漏洞通常是由于開(kāi)發(fā)者未正確驗(yàn)證和過(guò)濾用戶提供的輸入數(shù)據(jù)所導(dǎo)致的。為了防止原型鏈污染,開(kāi)發(fā)者應(yīng)該始終對(duì)用戶輸入進(jìn)行嚴(yán)格的驗(yàn)證和過(guò)濾,并避免直接使用用戶提供的數(shù)據(jù)來(lái)操作原型鏈上的屬性。另外,更新JavaScript運(yùn)行時(shí)環(huán)境和庫(kù)到最新版本也可以幫助防范已知的原型鏈污染漏洞。
在一個(gè)應(yīng)用中,如果攻擊者控制并修改了一個(gè)對(duì)象的原型,那么將可以影響所有和這個(gè)對(duì)象來(lái)自同一個(gè)類、父祖類的對(duì)象。這種攻擊方式就是原型鏈污染。
2.原型鏈三屬性
1)prototype
prototype
是函數(shù)對(duì)象特有的屬性。在 JavaScript 中,每個(gè)函數(shù)都有一個(gè)prototype
屬性,它是一個(gè)指向?qū)ο蟮囊?。這個(gè)對(duì)象被稱為該函數(shù)的原型對(duì)象,它包含了可以由該函數(shù)的所有實(shí)例共享的屬性和方法。當(dāng)通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象實(shí)例時(shí),實(shí)例的__proto__
屬性會(huì)指向構(gòu)造函數(shù)的prototype
對(duì)象。
2)constructor
constructor
屬性是原型對(duì)象的一個(gè)屬性,它指向構(gòu)造函數(shù)本身。當(dāng)你創(chuàng)建一個(gè)函數(shù)并給它設(shè)置prototype
屬性后,prototype
對(duì)象會(huì)自動(dòng)獲得一個(gè)名為constructor
的屬性,該屬性指向該函數(shù)本身。這樣,通過(guò)實(shí)例對(duì)象的constructor
屬性,你可以訪問(wèn)到創(chuàng)建該實(shí)例的構(gòu)造函數(shù)。
3)__proto__
__proto__
是每個(gè)對(duì)象都有的屬性,它指向?qū)ο蟮脑?。?JavaScript 中,對(duì)象通過(guò)__proto__
屬性鏈接到它們的原型對(duì)象,從而形成了原型鏈。當(dāng)你訪問(wèn)一個(gè)對(duì)象的屬性時(shí),如果該對(duì)象本身沒(méi)有該屬性,JavaScript 就會(huì)沿著原型鏈往上查找,直到找到該屬性或者到達(dá)原型鏈的頂端(通常是Object.prototype
)。
4)原型鏈三屬性之間關(guān)系?
// 創(chuàng)建一個(gè)構(gòu)造函數(shù)
function Person(name) {
this.name = name;
}
// 給構(gòu)造函數(shù)的 prototype 添加一個(gè)方法
Person.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
};
// 創(chuàng)建一個(gè)實(shí)例
const john = new Person('John');
// 使用 __proto__ 訪問(wèn)原型對(duì)象
console.log(john.__proto__ === Person.prototype); // true
// 使用 constructor 訪問(wèn)構(gòu)造函數(shù)
console.log(john.constructor === Person); // true
// 使用 Object.getPrototypeOf() 訪問(wèn)原型對(duì)象
console.log(Object.getPrototypeOf(john) === Person.prototype); // true
// 使用原型鏈調(diào)用方法
john.sayHello(); // 輸出: "Hello, I am John"
3.JavaScript原型鏈繼承
function Father() {
this.first_name = 'Donald'
this.last_name = 'Trump'
}
function Son() {
this.first_name = 'Melania'
}
Son.prototype = new Father()
let son = new Son()
console.log(`Name: ${son.first_name} ${son.last_name}`)
1)分析
Son類繼承了Father類的last_name
屬性,最后輸出的是Name: Melania Trump
2)總結(jié)
在對(duì)象son中尋找last_name
如果找不到,則在
son.__proto__
中尋找last_name如果仍然找不到,則繼續(xù)在
son.__proto__.__proto__
中尋找last_name依次尋找,直到找到
null
結(jié)束。比如,Object.prototype
的__proto__
就是null
3)運(yùn)行結(jié)果?
?4.原型鏈污染簡(jiǎn)單實(shí)驗(yàn)
1)實(shí)驗(yàn)一
let foo = {bar :1}
console.info(foo.bar)
//foo是一個(gè)object foo.__proto__ === object.prototype
foo.__proto__.bar = 2
console.info(foo.bar)
let zoo = {}
console.info(zoo.bar)
?污染過(guò)程
因?yàn)榍懊嫖覀冃薷牧薴oo的原型
foo.__proto__.bar = 2
,而foo是一個(gè)Object類的實(shí)例,所以實(shí)際上是修改了Object這個(gè)類,給這個(gè)類增加了一個(gè)屬性bar,值為2。后來(lái),我們又用Object類創(chuàng)建了一個(gè)zoo對(duì)象
let zoo = {}
,zoo對(duì)象自然也有一個(gè)bar屬性
?2)實(shí)驗(yàn)2
function merge(target, source) {
for (let key in source) {
if (key in source && key in target) {
merge(target[key], source[key])
} else {
target[key] = source[key]
}
}
}
var x = {
age:11
}
var y = {
age: 12,
num: 100
}
merge(x,y)
console.info(x)
console.info(y)
運(yùn)行結(jié)果:
為什么會(huì)被污染?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-623275.html
merge
函數(shù)的目的是將source
對(duì)象中的屬性合并到target
對(duì)象中。如果source
對(duì)象和target
對(duì)象具有相同的鍵(屬性名),那么merge
函數(shù)將遞歸地將嵌套對(duì)象的屬性合并。否則,如果source
對(duì)象具有target
對(duì)象中不存在的鍵,merge
函數(shù)將直接將該鍵值對(duì)添加到target
對(duì)象中,接下來(lái),執(zhí)行merge(x, y)
語(yǔ)句將會(huì)將y
對(duì)象的屬性合并到x
對(duì)象中文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-623275.html
到了這里,關(guān)于網(wǎng)絡(luò)安全--原型鏈污染的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!