為了實作跨域,目前主流的兩種方法就是JSONP和CORS。原理是利用<code><script></code>标簽中的src屬性沒有跨域限制
可以利用回調函數,比如以下的callback寫法
<code><script src="http://jsonp.com/callback.php?callback=hehehe"></script></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出來。最終的結果如下

此時即拿到了B網站callback.php上的資料
通過上面示範中的場景來看JSONP劫持。B網站開放了一個JSONP接口,也就是上面示範中的<code>http://jsonp.com/callback.php?callback=</code>。此接口可以傳回B網站使用者的資訊,id,email等。
此時我們搭建一個惡意的A網站,寫入類似于上面示範中的代碼,隻不過把alert彈窗出資料,換成了發送給黑客的遠端伺服器。這時候把A網站發送給使用者誘導去點選,則可以擷取使用者的資訊了。此類操作有點像CSRF
惡意代碼利用如下:
jsonp.html
利用python開啟http服務,綁定1122端口,通路構造好的jsonp.html後,則資料發送到了我們的伺服器上
收集接口:找到傳回資料格式是JSONP的接口(可以在資料包中檢索關鍵詞callback json jsonp email等,也可以加上callback參數,觀察傳回值是否變化)
加參數看傳回資訊:加上callback參數,觀察傳回值是否變化,是否傳回jsonp格式的資訊
比如以下就是标準的JSONP格式的資訊
<code>hehehe({"customername1":"user1","password":"12345678"})</code>
實戰中的jsonp資訊如下
除了加上callback參數,還有其他參數也可能存在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=<script>alert(/xss/)</script></code>形式的xss
4)過濾callback函數名以及JSON資料輸出,預防xss