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