【web安全】Nodejs原型鏈汙染分析

M發表於2022-02-13

Nodejs原型鏈汙染分析

什麼是js原型?

可以將js原型理解為其他OOP語言中的類,但還是有細微區別。

1. function F(){...}
2. var f = new F();
分析:
1.建立一個func F,同時創立了一個F物件(該物件預設是接著Object的原型鏈,可以理解為Object的例項物件),並將F的構造器指向了function F(),同時設定內部屬性prototype指向了物件F本身。
2. 當對物件F或叫函式F進行例項化時,會建立 一個例項物件,同時該例項物件預設加一個__proto__屬性,指向F物件。

什麼是js原型鏈?

弄明白了js原型,那js原型鏈就應該很清楚了。。。(狗頭保命:畢竟不可能說大實話“原型鏈就是原型組成的鏈子吧!”

原型鏈汙染是個什麼東東?

首先思考:foo.__proto__指向的是Foo類的prototype。那麼,如果我們修改了foo.__proto__中的值,是不是就可以修改Foo類呢?

image

如圖,先建立一個物件a,並例項化賦值給test1。再建立一個b物件,把test1的__proto__指向b物件。但似乎沒什麼變化呀???原型鏈汙染是假的?
image

檢視test1的原型,確實已經變為b了啊,為啥沒有b的屬性y呢?其實因為這個函式相當於是一個建構函式,裡面this.y只在它對應的例項化物件中才會有。直接改鏈,但這個函式又沒執行,所以才會導致最後顯示沒有y屬性,只要將y屬性新增到b物件中即可
image

如圖,在b原型物件中新增一個z屬性,test1中便可以使用到該屬性,從而達到汙染原型鏈的目的。

原型鏈汙染怎麼利用呢?

說到底就是因為修改了__proto__屬性使得例項物件的原型鏈發生了變化。所以我們可以看看哪些操作會修改__proto__屬性,而操作屬性一般還可以用陣列的方式,如: test1['proto'] = xxx。所以最可能造成原型鏈汙染的和運算元組的函式分不開聯絡。

需要注意的有merge,clone等函式

原型鏈汙染在ctf中的利用

https://blog.happysec.cn/index/view/328.html
參考P神大作

小結

  1. js原型鏈的資料分析
  2. express框架支援根據Content-Type來解析請求Body,所以可以很方便的設定payload

相關文章