日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在講這個漏洞之前我們來理解一下JAVAscript。與其他的語言不同的是,Js在Es6之前是沒有class的,他更多的是一個原型語言,在Js里有一句話很有名——“一切皆對象”。

什么是原型語言

1.只有對象,沒有類;對象繼承對象,而不是類繼承類。

2.“原型對象”是核心概念。原型對象是新對象的模板,它將自身的屬性共享給新對象。一個對象不但可以享有自己創(chuàng)建時和運行時定義的屬性,而且可以享有原型對象的屬性。

3.每一個對象都有自己的原型對象,所有對象構(gòu)成一個樹狀的層級系統(tǒng)。root節(jié)點的頂層對象是一個語言原生的對象,只有它沒有原型對象,其他所有對象都直接或間接繼承它的屬性。

關(guān)于Function.prototype和Object.__proto__

1.對象有__proto__屬性,函數(shù)有prototype屬性;

2.對象由函數(shù)生成;

3.生成對象時,對象的__proto__屬性指向函數(shù)的prototype屬性。

在沒有手動修改__proto__屬性的指向時,以上三條便是JavaScript默認(rèn)原型鏈指向邏輯。如果要更形象的去理解這個就可以看下下圖的這個結(jié)構(gòu)

Javascript原型鏈攻擊與防御

 

什么是JavaScript原型鏈污染

原型鏈污染來自一個CVE,這個CVE是一個在jquery中修復(fù)的漏洞,但是這個漏洞廣義的推廣的話,受影響的范圍應(yīng)該是一切使用了ecmascript的應(yīng)用,無論前后端。關(guān)于這個漏洞,是修復(fù)了jQuery的$.extend(true…)方法,在jQuery中,這個方法用于將一個或多個對象的內(nèi)容合并到目標(biāo)對象。所以你永遠(yuǎn)不知道有不有人會不會寫出一些類似以下的代碼

當(dāng)我們可控$.extend的參數(shù)的時候,我們就可以覆蓋對象的__proto__或者prototype方法從而控制整個原型鏈的最頂端的方法,重寫該方法將覆蓋子對象或者函數(shù)的方法,從而導(dǎo)致污染原本的方法意圖。

在npmjs官方搜下對象操作的庫可以看到一大堆,例如“xtend”、 “deepmerge”、 “webpack-merge”、 “merge2”、 “lodash.merge”。假如一些應(yīng)用使用了這些方法,但是對參數(shù)沒做任何處理。

漏洞范圍影響

提出這個Javascript原型鏈污染攻擊的作者寫了一個pdf,在該pdf中,作者不僅做了漏洞的成因分析,還針對此漏洞做了受害范圍分析,他在github上搜索了部分的組件,這些組件都是可以操作對象,一般都是對象合并操作的,較為底層,因此也會有大量的應(yīng)用基于這些組件。例如“hoek”,“lodash”,“defaults-deep”等修復(fù)了這個原型鏈污染的可能性,當(dāng)然還有一些組件他沒統(tǒng)計到,例如“xtend”之類的,光weekly download的數(shù)量就有“12,097,425”。

筆者在npm上搜索了基于xtend的一些應(yīng)用,找到一個language-exec這樣的一個組件。這個組件是一個基于xtend的,不過這個組件好像年久失修而且沒啥人用,看了源代碼其中就有這樣的一句話

可以看到類似的寫法都是存在問題的(主要是我沒找到具體的基于xtend的受影響應(yīng)用)。

所以基于這個,大家不是有了刷CVE的思路了?沒錯…只要你敢花時間去爬全部的dependence就可以有機會獲得javascript pollution attack CVE。

案例一遠(yuǎn)程命令執(zhí)行

作者在github上搜到了一款叫做ghost cms的應(yīng)用,當(dāng)然這個漏洞已經(jīng)修復(fù),當(dāng)黑客發(fā)送以下請求即可實現(xiàn)控制任意方法或者對象的任意屬性。當(dāng)然也就是rce了

在一切皆對象的JavaScript中,所有對象都可以調(diào)用toString和valueOf方法,當(dāng)你通過__proto__重寫這2個方法的時候,就容易在express等web框架中產(chǎn)生dos,導(dǎo)致服務(wù)無法正常運行。類似以下的寫法就容易產(chǎn)生拒絕服務(wù)。

Javascript原型鏈攻擊與防御

 

案例二DOS

在一切皆對象的JavaScript中,所有對象都可以調(diào)用toString和valueOf方法,當(dāng)你通過__proto__重寫這2個方法的時候,就容易在express等web框架中產(chǎn)生dos,導(dǎo)致服務(wù)無法正常運行。類似以下的寫法就容易產(chǎn)生拒絕服務(wù)

Javascript原型鏈攻擊與防御

 

案例三任意文件讀取

如果你可以通過污染原型鏈來重寫一些“私有屬性”的話(Javascript沒有私有屬性),可能可以重寫那些在WEB中用來定義渲染模板文件的屬性值,就有可能產(chǎn)生任意文件讀取了,如以下這個圖片

Javascript原型鏈攻擊與防御

 

如何防御

在這里我們了解下這類攻擊,如何從代碼上更安全的編寫,更好的防御這類漏洞。漏洞發(fā)現(xiàn)的作者給出了2個解決方案,先來看看我是如何防御的。

如果是我來解決這個問題的話,我會選擇迭代對象的屬性,直到查找到__proto__和prototype這2個屬性名,如果出現(xiàn)就干掉。但是這個方法還是有缺陷,一個是建立于黑名單,需要列入的屬性太多了,例如Dos的話就要把tostring和valueof等方法列入,而且遇到私有屬性覆蓋的話,怎么確保參數(shù),接口很多。

原作者提出了3點:

  • 使用Object.freeze來凍結(jié)對象,幾乎所有的JavaScript對象都是Object的實例。所以凍結(jié)Object.prototype即可。具體大家可以去了解下es5就新增的Object.freeze方法,使用了這個方法,那么黑客就無法對prototype新增或者重寫對應(yīng)原型鏈上的方法,不過這樣可能會導(dǎo)致一些隱性的bug產(chǎn)生,而且可能還不知道是哪里出錯了。
  • 用map數(shù)據(jù)結(jié)構(gòu)來代替自帶的對象結(jié)構(gòu)。Es6就有map結(jié)構(gòu)啦,這個map和Object的區(qū)別就是map的鍵可以是任意的對象類型,數(shù)組也好,對象也好。
  • 使用Object.create(null)(強烈推薦), 使用這個方法就可以更好的防御原型鏈污染攻擊了,因為Object.create(null)使得創(chuàng)建的新對象沒有任何的原型鏈,是null的,不具備任何的繼承關(guān)系,當(dāng)你接受一個客戶端的參數(shù)并且打算merge的話,可以使用此方法后去merge,這樣的對象是比較安全的,客戶端沒辦法通過原型鏈來污染攻擊(因為壓根就沒原型鏈通往其他的對象)。我們可以簡單的通過一個實驗來看下。
Javascript原型鏈攻擊與防御

 


Javascript原型鏈攻擊與防御

 


Javascript原型鏈攻擊與防御

以上全部數(shù)據(jù)來源互聯(lián)網(wǎng),如有侵權(quán),請及時與我們聯(lián)系,我們將進(jìn)行刪除,謝謝

分享到:
標(biāo)簽:原型 攻擊
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定