原型鏈汙染

BWCEN發表於2024-11-25

1.什麼是原型鏈汙染

原型鏈汙染是JavaScript中的一種安全漏洞,它利用了JavaScript的原型繼承機制。在JavaScript中,物件透過原型鏈繼承屬性和方法。如果攻擊者能夠修改物件的原型,那麼所有從該原型繼承的物件都可能受到影響,這就是原型鏈汙染。

2.原型鏈汙染的原理

在JavaScript中,每個物件都有一個名為__proto__的屬性,它指向該物件的原型。原型物件本身也可能有原型,形成一個原型鏈。當訪問物件的屬性或方法時,如果該物件本身沒有該屬性或方法,JavaScript引擎會沿著原型鏈向上查詢,直到找到為止。如果在原型鏈上插入惡意程式碼,那麼所有透過這個原型鏈查詢屬性或方法的物件都可能執行這些惡意程式碼。

在原型鏈汙染中離不開__proto__prototype

__proto__和prototype

JavaScript中,每個物件都有一個名為__proto__的內建屬性,它指向該物件的原型。同時,每個函式也都有一個名為 prototype 的屬性,它是一個物件,包含建構函式的原型物件應該具有的屬性和方法。簡單來說,__proto__ 屬性是指向該物件的原型,而 prototype屬性是用於建立該物件的建構函式的原型。

1、prototype是一個類的屬性,所有類物件在例項化的時候將會擁有prototype中的屬性和方法
2、一個物件的__proto__屬性,指向這個物件所在的類的prototype屬性
關係圖如下所示

3.原型鏈汙染的實施

舉一個例子

var a = {number : 520}
var b = {number : 1314}
b.__proto__.number=520 
var c= {}
c.number

  在這個例子中先建立了兩個物件:a和b,並對這兩個物件的鍵number進行賦值。
然後透過例項物件b,利用__proto__對原型進行修改,將鍵賦值為520。(這個修改並不會影響a和b的鍵的值)
我們在建立一個新的物件c,但並不對c進行初始化。但在查詢c.number的值時,我們能得到.number=520

原因:

1、在b物件中尋找number屬性
2、當在b物件中沒有找到時,它會在b.__proto__中尋找number屬性
3、如果仍未找到,此時會去b.__proto__.__proto__中尋找number屬性

  因此在查詢b.number時,在物件b中直接找到了number屬性,得到了b.number=1314
而後在查詢c.number時,由於物件c中沒有number屬性,會再次進入c.__proto__中尋找number屬性。而b.__proto__和c.__proto__是一樣的,都是例項原型,因此c.__proto__=520

實戰

攻防世界-wife_wife

參考文章:淺析CTF中的Node.js原型鏈汙染 - FreeBuf網路安全行業門戶

相關文章