JSONP劫持


什么是 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 遠程調用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM