国产成人毛片毛片久久网_国产午夜激无码av毛片不_国产乱对白精彩在线播放_av资源站中文字幕_亚洲男人的天堂网站_国产成 人 综合 亚洲网_中国国产激情一区_少妇一级淫片免费放_亚洲一本大道av久在线播放_免费观看美女裸体网站

行業(yè)動態(tài)

防御吧作為15年知名老牌域名服務商,CNNIC和CANN雙認證域名注冊商,已經(jīng)
持續(xù)為500多萬個域名提供服務,包括智能DNS/自由轉(zhuǎn)移/隱私保護等服務!
Javascript原型鏈攻擊與防御
2019-10-14 09:55:46 【

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

什么是原型語言

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

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

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

關于Function.prototype和Object.__proto__

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

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

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

在沒有手動修改__proto__屬性的指向時,以上三條便是java script默認原型鏈指向邏輯。如果要更形象的去理解這個就可以看下下圖的這個結構


什么是java script原型鏈污染

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

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

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

漏洞范圍影響

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

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

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

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

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

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

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


案例二DOS

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


案例三任意文件讀取

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


如何防御

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

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

原作者提出了3點:

1、使用Object.freeze來凍結對象,幾乎所有的java script對象都是Object的實例。所以凍結Object.prototype即可。具體大家可以去了解下es5就新增的Object.freeze方法,使用了這個方法,那么黑客就無法對prototype新增或者重寫對應原型鏈上的方法,不過這樣可能會導致一些隱性的bug產(chǎn)生,而且可能還不知道是哪里出錯了。

2、用map數(shù)據(jù)結構來代替自帶的對象結構。Es6就有map結構啦,這個map和Object的區(qū)別就是map的鍵可以是任意的對象類型,數(shù)組也好,對象也好。

3、使用Object.create(null)(強烈推薦), 使用這個方法就可以更好的防御原型鏈污染攻擊了,因為Object.create(null)使得創(chuàng)建的新對象沒有任何的原型鏈,是null的,不具備任何的繼承關系,當你接受一個客戶端的參數(shù)并且打算merge的話,可以使用此方法后去merge,這樣的對象是比較安全的,客戶端沒辦法通過原型鏈來污染攻擊(因為壓根就沒原型鏈通往其他的對象)。我們可以簡單的通過一個實驗來看下。




*轉(zhuǎn)載自FreeBuf.COM


】【打印關閉】 【返回頂部
分享到QQ空間
分享到: 
上一篇香港高防服務器防攻擊原理 下一篇Windows服務器主機加固

立足首都,輻射全球,防御吧專注云防御及云計算服務15年!

聯(lián)系我們

服務熱線:13051179500 18910191973
企業(yè)QQ:1245940436
技術支持:010-56159998
E-Mail:xihedata.com
Copyright ? 2003-2016 fangyuba. 防御吧(完美解決防御與加速) 版權所有 增值許可:京B2-20140042號
售前咨詢
公司總機:18910191973
24小時電話:010-56159998
投訴電話:18910191973
值班售后/技術支持
售后服務/財務
備案專員
緊急電話:18610088800