什么是 JSONP 劫持
JSONP就是為了跨域 獲取資源 而產生的一種 非官方 的技術手段(官方的有 CORS 和 postMessage),它利用的是 script 標簽的 src 屬性不受同源策略影響的特性。
我們遇到過很多的劫持的攻擊方法,比如:dns 劫持、點擊劫持、cookie劫持等等,也正如劫持這個詞的含義:“攔截挾持”,dns 劫持就是把 dns 的解析截獲然后篡改,點擊劫持就是截獲你的鼠標的點擊動作,在用戶不知情的情況下點擊攻擊者指定的東西,cookie 劫持就是獲取用戶的 cookie,然后可以進一步偽造身份,那么同樣, jsonp 劫持就是攻擊者獲取了本應該傳給網站其他接口的數據
JSONP 漏洞的利用過程及危害
通過JSONP技術可以實現數據的跨域訪問,必然會產生安全問題,如果網站B對網站A的JSONP請求沒有進行安全檢查直接返回數據,則網站B 便存在JSONP 漏洞,網站A 利用JSONP漏洞能夠獲取用戶在網站B上的數據。
JSONP漏洞利用過程如下:
1)用戶在網站B 注冊並登錄,網站B 包含了用戶的id,name,email等信息;
2)用戶通過瀏覽器向網站A發出URL請求;
3)網站A向用戶返回響應頁面,響應頁面中注冊了 JavaScript 的回調函數和向網站B請求的script標簽,示例代碼如下:
<script type="text/javascript"> function Callback(result) { alert(result.name); } </script> <script type="text/javascript" src="http://B.com/user?jsonp=Callback"></script>
4)用戶收到響應,解析JS代碼,將回調函數作為參數向網站B發出請求;
5)網站B接收到請求后,解析請求的URL,以 JSON 格式生成請求需要的數據,將封裝的包含用戶信息的JSON數據作為回調函數的參數返回給瀏覽器,網站B返回的數據實例如下:
Callback({"id":1,"name":"test","email":"test@test.com"})。
6)網站B數據返回后,瀏覽器則自動執行Callback函數對步驟4返回的JSON格式數據進行處理,通過alert彈窗展示了用戶在網站B的注冊信息。另外也可將JSON數據回傳到網站A的服務器,這樣網站A利用網站B的JSONP漏洞便獲取到了用戶在網站B注冊的信息。
JSONP 漏洞利用過程示意圖
JSONP 劫持漏洞的危害
JSONP是一種敏感信息泄露的漏洞,經過攻擊者巧妙而持久地利用,會對企業和用戶造成巨大的危害。攻擊者通過巧妙設計一個網站, 網站中包含其他網站的JSONP漏洞利用代碼 ,將鏈接通過郵件等形式推送給受害人, 如果受害者點擊了鏈接,則攻擊者便可以獲取受害者的個人的信息,如郵箱、姓名、手機等信息, 這些信息可以被違法犯罪分子用作“精准詐騙”。對方掌握的個人信息越多,越容易取得受害人的信任,詐騙活動越容易成功,給受害人帶來的財產損失以及社會危害也就越大。
JSONP 漏洞利用技巧
利用技巧
JSONP 漏洞主要被攻擊者用來在受害者不知不覺中竊取他們的隱私數據,常常被一些 APT 組織采用進行信息收集和釣魚的工作( 水坑攻擊 ),下面的一個例子就可以說是在模擬水坑攻擊
當我們發現信息泄露的 jsonp 接口以后我們要做的就是在自己的網站上寫一個腳本,然后引誘受害者去訪問這個網站,一旦訪問了這個網站,腳本就會自動運行,就會想這個接口請求用戶的敏感數據,並傳送到攻擊者的服務器上
$.ajax({ url: 'https://api.weibo.com/2/{隱藏了哦}', type: 'get', dataType: 'jsonp', }).done(function(json){ var id = json["data"]["id"]; var screen_name = json["data"]["screen_name"]; var profile_image_url = json["data"]["profile_image_url"]; var post_data = ""; post_data += "id=" + id + "&"; post_data += "screen_name=" + screen_name + "&"; post_data += "profile_image_url=" + encodeURIComponent(profile_image_url); console.log(post_data); // 發送到我的服務器上 }).fail(function() {});
這樣就能收到大量用戶的敏感信息了
相關擴展
(1)既然是竊取敏感信息,那么敏感信息除了一些 email 手機號 用戶名等還有什么呢?沒錯,甚至可以是 CSRF Token 信息,有時候在 CSRF token 獲取不到但是又找不到 XSS 的攻擊點的時候不妨考慮一下 jsonp 劫持。
(2)這個攻擊方式有點類似於 CSRF。
防護方案
1、嚴格安全的實現 CSRF 方式調用 JSON 文件:限制 Referer 、部署一次性 Token 等。
2、嚴格安裝 JSON 格式標准輸出 Content-Type 及編碼( Content-Type : application/json; charset=utf-8 )。
3、嚴格過濾 callback 函數名及 JSON 里數據的輸出。
4、嚴格限制對 JSONP 輸出 callback 函數名的長度(如防御上面 flash 輸出的方法)。
5、其他一些比較“猥瑣”的方法:如在 Callback 輸出之前加入其他字符(如:/**/、回車換行)這樣不影響 JSON 文件加載,又能一定程度預防其他文件格式的輸出。還比如 Gmail 早起使用 AJAX 的方式獲取 JSON ,聽過在輸出 JSON 之前加入 while(1) ;這樣的代碼來防止 JS 遠程調用。