一次實(shí)戰(zhàn)之 JSONP 漏洞
描述
Jsonp(JSON with Padding) 是 json 的一種"使用模式",可以讓網(wǎng)頁(yè)從別的域名(網(wǎng)站)那獲取資料,即跨域讀取數(shù)據(jù)。
為什么我們從不同的域(網(wǎng)站)訪(fǎng)問(wèn)數(shù)據(jù)需要一個(gè)特殊的技術(shù)(JSONP )呢?這是因?yàn)橥床呗浴?/p>
同源策略,它是由Netscape提出的一個(gè)著名的安全策略,現(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略。
傳入callback 值會(huì)在結(jié)果里面直接返回。因此,如果該參數(shù)過(guò)濾不嚴(yán)格。可以隨便輸入:callback值為:alert(‘1’);parseResponse 字符串。返回結(jié)果會(huì)打印個(gè)alert窗口,然后也會(huì)正常執(zhí)行。
實(shí)際上就是由于服務(wù)器端對(duì)JSONP 的請(qǐng)求來(lái)源的檢查不嚴(yán)格導(dǎo)致的;
攻擊者模擬用戶(hù)向有漏洞的服務(wù)器發(fā)送JSONP請(qǐng)求,然后就獲取到了用戶(hù)的某些信息,再將這些信息發(fā)送到攻擊者可控的服務(wù)器
原理
JSONP的最基本的原理是:動(dòng)態(tài)添加一個(gè)
過(guò)程
首先,找到存在該漏洞地址:
修改請(qǐng)求包信息,在返回值開(kāi)頭中可見(jiàn)calmness;
傳過(guò)去的calmness就是函數(shù)名,服務(wù)端返回的是一個(gè)函數(shù)調(diào)用,可以理解為:evil就是一個(gè)函數(shù),(["customername1","customername2"])就是函數(shù)參數(shù),網(wǎng)站前端只需要再編寫(xiě)代碼處理函數(shù)返回的值即可。
繼續(xù):
如果我們修改jsoncallback的值為其他值,此處的返回值也會(huì)相應(yīng)改變。我們可以劫持jsoncallback參數(shù),自己構(gòu)造jsoncallback處理函數(shù),受害者點(diǎn)擊我們偽造的鏈接后,向jsonp接口發(fā)起請(qǐng)求,請(qǐng)求得到數(shù)據(jù)的處理方式由我們自己的jsoncallback處理函數(shù)處理,由此可以達(dá)到劫持目的
進(jìn)行POC的編寫(xiě)或者進(jìn)行淘金
當(dāng)然,還有繞過(guò)token防護(hù)進(jìn)行csrf攻擊;Referer 頭的繞過(guò)等等;
修復(fù)建議
json正確的http頭輸出盡量避免跨域的數(shù)據(jù)傳輸,對(duì)于同域的數(shù)據(jù)傳輸使用xmlhttp的方式作為數(shù)據(jù)獲取的方式,依賴(lài)于javascript在瀏覽器域里的安全性保護(hù)數(shù)據(jù)。如果是跨域的數(shù)據(jù)傳輸,必須要對(duì)敏感的數(shù)據(jù)獲取做權(quán)限認(rèn)證。