Ajax的安全性問題

2018-09-06 18:25 更新
Ajax或“非同步JavaScript和XML”是一個(gè)相對(duì)較新的和動(dòng)態(tài)的Web技術(shù),其工作在異步方式與服務(wù)器進(jìn)行交互。在傳統(tǒng)的Web方法使一個(gè)新的瀏覽器刷新整個(gè)頁面,并重新加載它,這是既耗時(shí)又耗費(fèi)帶寬的要求。使用AJAX,子程序可以不完全重新加載頁面請(qǐng)求新的服務(wù)器數(shù)據(jù),從而給用戶帶來更快的和豐富的體驗(yàn)。它發(fā)生在后臺(tái)用戶不知情的情況下,用戶看到的是一個(gè)流暢的體驗(yàn)。XMLHttpRequest對(duì)象是用來與服務(wù)器的交互。Ajax請(qǐng)求一個(gè)簡單的例子就是通過谷歌搜索提示語的人口,而我們開始打字的話。沒有發(fā)送的全部內(nèi)容,它不斷猜測,更新和加載搜索結(jié)果沒有擊中搜索按鈕。


在Ajax請(qǐng)求/響應(yīng)的數(shù)據(jù)可以在XML或JSON,認(rèn)為這是一種重量輕的數(shù)據(jù)傳輸比傳統(tǒng)形式的基礎(chǔ)數(shù)據(jù)。


數(shù)據(jù)泄漏在Ajax或JSON劫持:


在繼續(xù)之前讓我們明白一個(gè)重要的概念:


1.JavaScript表達(dá)式


2.JavaScript數(shù)組


JavaScript表達(dá)式執(zhí)行的JavaScript解析器,但數(shù)組是:


列如:


<script>


{“t”:1,”p”:1,”r”:1,”rows”:[{"i":0,"c":["n","H, C","A","5","T","n"]}]}


</script>
這將不被執(zhí)行,即對(duì)象將不會(huì)被創(chuàng)建。上面的例子是一個(gè)JavaScript表達(dá)式。


但現(xiàn)在,當(dāng)它被轉(zhuǎn)換成一個(gè)數(shù)組,如下面給出:


<script>


[{"t":1,"p":1,"r":1,"rows":[{"i":0,"c":["n","H, C","A","5","T","n"]}]}]


</script>
這才會(huì)被執(zhí)行。


情景:


用戶登錄到一個(gè)脆弱的應(yīng)用(victimsite.com)的服務(wù)器JSON形式的陣列和數(shù)據(jù)敏感性質(zhì)。用戶獲取認(rèn)證令牌(身份驗(yàn)證)的應(yīng)用。


攻擊者誘使用戶點(diǎn)擊一個(gè)鏈接,使用網(wǎng)絡(luò)釣魚或發(fā)送電子郵件給用戶。


用戶點(diǎn)擊該鏈接時(shí),頁面加載,從攻擊者的網(wǎng)站,下面的腳本嵌入:


<script>


Object.prototype.__defineSetter__(“t”,function(obj){alert(1);for(var i in obj) {alert(i + ‘=’ + obj[i]);} });


</script>


<script>


src=”http://victimsite.com/mainJSON”/> //this points to the JSON


</script>


腳本再次發(fā)出請(qǐng)求,victimsite.com和訪問主JSON頁發(fā)送敏感數(shù)據(jù)到攻擊者的網(wǎng)頁,其中有兩個(gè):現(xiàn)在JSON數(shù)據(jù)和身份驗(yàn)證令牌。


然而,上述攻擊的先決條件是JSON數(shù)據(jù)必須敏感于自然和瀏覽器應(yīng)該接受__defineSetter__方法,它覆蓋了現(xiàn)有的DOM或函數(shù)時(shí)調(diào)用屬性setter。在以上示例中,只要是被稱為“t”內(nèi)的屬性,函數(shù)警報(bào),并且顯示它。然而,沒有多少瀏覽器支持defineSetter,’方法。


應(yīng)對(duì)措施:


切勿將敏感信息發(fā)送JSON或不給他們使用JSON數(shù)組,這使得它可以通過腳本標(biāo)記有效的JavaScript。


只服務(wù)身份驗(yàn)證的請(qǐng)求,意味著使用某種形式的身份驗(yàn)證來保護(hù)數(shù)據(jù)


必須發(fā)送JSON數(shù)據(jù)通過POST,GET,這將使它很難在<script>標(biāo)簽包括URL


CSRF是什么?


CSRF代表跨站請(qǐng)求偽造,利用Web技術(shù)的一個(gè)基本的缺陷,它依賴于基于cookie認(rèn)證并提交一個(gè)請(qǐng)求從用戶到服務(wù)器。在CSRF攻擊者可以欺騙用戶執(zhí)行,這是一個(gè)動(dòng)作,不是有意的。必須進(jìn)行身份驗(yàn)證和用戶的攻擊的時(shí)候,有一個(gè)有效的會(huì)話ID。攻擊者也是使用一個(gè)有效的應(yīng)用程序,并知道應(yīng)用程序的內(nèi)部運(yùn)作。更多關(guān)于CSRF這里:


CSRF和Ajax:


盡管CSRF是在傳統(tǒng)的Web應(yīng)用中非常普遍,如果預(yù)防是無法實(shí)現(xiàn)的,它也可以進(jìn)行基于AJAX的Web應(yīng)用程序。唯一困難的是,因?yàn)樗且粋€(gè)隱藏的請(qǐng)求,它不是直接創(chuàng)建一個(gè)有效的請(qǐng)求。我們需要不僅要求技巧的標(biāo)準(zhǔn),但我們也需要堅(jiān)持有效的數(shù)據(jù)格式。


攻擊的步驟:


1.用戶到Web應(yīng)用程序進(jìn)行身份驗(yàn)證,并瀏覽其內(nèi)容。


2.攻擊者,也是一個(gè)有效的用戶,創(chuàng)建一個(gè)用戶身份驗(yàn)證點(diǎn)擊一個(gè)鏈接,獲取以下html頁面和加載載在其瀏覽器。


3.因此瀏覽器發(fā)出請(qǐng)求代表身份驗(yàn)證的用戶。


ajax安全性

防御措施:


為了防止這種攻擊,類似傳統(tǒng)的做法,要做到這一點(diǎn)有兩種方式:


嵌入非猜測的,隨機(jī)的令牌稱為當(dāng)前請(qǐng)求/響應(yīng)用戶請(qǐng)求的身份驗(yàn)證和一個(gè)來自攻擊者的區(qū)分。這種方法基本上服務(wù)器嵌入當(dāng)前請(qǐng)求頁面。當(dāng)用戶提交頁面的服務(wù)器的可用性檢查的隨機(jī)數(shù),如果匹配,完成請(qǐng)求,否則拒絕。


使用Anti-CSRF header:我們的想法是生成一個(gè)自定義的heade, x-session-token在這種情況下,這被認(rèn)為是敏感的,包括任何形式的交易請(qǐng)求。例如:xhr.setRequestHeader(’x-session-token’,csrf_token)


在服務(wù)端,服務(wù)器檢查這個(gè)header如果發(fā)現(xiàn)請(qǐng)求匹配,否則拒絕。我們需要利用這種技術(shù)使用XHR調(diào)用,還沒有用常規(guī)POST和GET請(qǐng)求。


XSS和Ajax:


XSS或跨站腳本:當(dāng)一個(gè)應(yīng)用程序不將用戶輸入或輸出為HTML渲染之前,它成為一個(gè)誘人的目標(biāo),因?yàn)樗麄兛梢栽趹?yīng)用程序中插入惡意的JavaScript,并隨后進(jìn)行放一炮而紅的攻擊目標(biāo),例如,會(huì)話劫持,網(wǎng)絡(luò)釣魚,惡意軟件感染等更多在這里:


在Ajax應(yīng)用程序中尋找XSS:


可能的XSS指針是在JavaScript文件中的以下功能(JS)的存在。Ajax從后端接收響應(yīng),并填充的瀏覽器,使用以下功能之一:


document.write(): 這可能導(dǎo)致基于DOM的XSS。如果值沒有被正確過濾或修改一個(gè)特定部分的信息使用eval()是另一個(gè)指針。


其他易受傷害的功能被定為的innerHTML()和write()。


仔細(xì)掃描JavaScript的文件,在客戶端加載目標(biāo)頁面的加載時(shí)間,可以給正在使用危害的函數(shù)一些提示。Firebug工具,它是偉大的,非常方便的在做這樣的分析。我們可以找出所有的Ajax調(diào)用XHR標(biāo)簽


下(圖):防御措施:

ajax

掃描的JavaScript文件也很容易用這個(gè)工具。它會(huì)列出所有依賴JS的文件,從而可以得到審查存在一個(gè)或多個(gè)上述功能。點(diǎn)擊腳本標(biāo)簽提供的所有JavaScript文件加載:

w3cschool

此外看看以下實(shí)例:


if(window.XMLHttpRequest)


http = new XMLHttpRequest();


eval(info);


if(window.XMLHttpRequest)


http = new XMLHttpRequest();


document.write(blogdetail);
我們需要分析這些功能,因?yàn)樗鼈兛赡苁俏催^濾的數(shù)據(jù),可被利用的入口點(diǎn)。


一個(gè)從iSEC Partners的好例子:


XSS有效加載在Jason和它們的效果:


var inboundJSON = {“people”: [


{"name": "Joel", "address": “<script type="text/javascript">// <![CDATA[


badStuff();


// ]]></script>”, “phone”: “911″}]};


someObject.innerHTML(inboundJSON.people[0].address); // Vulnerable


document.write(inboundJSON.people[0].address); // Vulnerable


someObject.innerText(inboundJSON.people[0].address // Not Vulnerable
 


防御措施:


幾乎是相同的,我們會(huì)做傳統(tǒng)的XSS預(yù)防:


輸入驗(yàn)證:嚴(yán)格檢查什么是允許的,什么不是在用戶輸入。正確過濾白名單允許的字符


輸出驗(yàn)證:這意味著,所有的輸出必須正確編碼,然后呈現(xiàn)給用戶如HTMLEncoding。


結(jié)論:


因此,大部分影響Ajax的問題是那些傳統(tǒng)的Web應(yīng)用程序,他們可能同樣的方式得到減輕。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)