天天看點

JSONP劫持

為了實作跨域,目前主流的兩種方法就是JSONP和CORS。原理是利用<code>&lt;script&gt;</code>标簽中的src屬性沒有跨域限制

可以利用回調函數,比如以下的callback寫法

<code>&lt;script src="http://jsonp.com/callback.php?callback=hehehe"&gt;&lt;/script&gt;</code>

回調函數:把函數名作為參數使用

假設有兩個網站A和B,A需要拿到B網站上的資料。

模拟B網站,建立一個callback.php,資料為 <code>$json_data = '{"customername1":"user1","password":"12345678"}';</code>

模拟A網站,建立一個test.html,取A網站上的資料,然後進行alert彈窗

通路test.html,頁面會執行script,請求http://localhost/callback.php?callback=hehehe,拿到callback.php的請求内容

然後将請求的内容作為參數,執行hehehe函數,hehehe函數将請求的内容alert出來。最終的結果如下

JSONP劫持

此時即拿到了B網站callback.php上的資料

通過上面示範中的場景來看JSONP劫持。B網站開放了一個JSONP接口,也就是上面示範中的<code>http://jsonp.com/callback.php?callback=</code>。此接口可以傳回B網站使用者的資訊,id,email等。

此時我們搭建一個惡意的A網站,寫入類似于上面示範中的代碼,隻不過把alert彈窗出資料,換成了發送給黑客的遠端伺服器。這時候把A網站發送給使用者誘導去點選,則可以擷取使用者的資訊了。此類操作有點像CSRF

JSONP劫持

惡意代碼利用如下:

jsonp.html

利用python開啟http服務,綁定1122端口,通路構造好的jsonp.html後,則資料發送到了我們的伺服器上

JSONP劫持

收集接口:找到傳回資料格式是JSONP的接口(可以在資料包中檢索關鍵詞callback json jsonp email等,也可以加上callback參數,觀察傳回值是否變化)

加參數看傳回資訊:加上callback參數,觀察傳回值是否變化,是否傳回jsonp格式的資訊

比如以下就是标準的JSONP格式的資訊

<code>hehehe({"customername1":"user1","password":"12345678"})</code>

實戰中的jsonp資訊如下

JSONP劫持

除了加上callback參數,還有其他參數也可能存在JSONP劫持,一般是由開發習慣來決定的,

JSONP劫持
JSONP劫持

對于JSONP劫持的防禦,其實類似于csrf的防禦。

1)限制來源refer

2)在請求中添加 csrfToken 并在後端進行驗證

3)按照JSON格式标準輸出(設定Content-Type : application/json; charset=utf-8),預防<code>http://127.0.0.1/getUsers.php?callback=&lt;script&gt;alert(/xss/)&lt;/script&gt;</code>形式的xss

4)過濾callback函數名以及JSON資料輸出,預防xss