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