Json Hijacking 簡介

Json Hijacking 是一項已經存在多年的安全漏洞,目前各大主流瀏覽器都已經修補

這裡進行說明,什麼是 Json Hijacking 以及防範方式:

當用戶登入 A 網站, A 網站是透過瀏覽器 cookie 進行身份驗證,以及具有以下特徵

  • 包含敏感資料
  • JSON array 的格式
  • GET requests.
  • 瀏覽器啟用了javascript
  • 瀏覽器支援 __defineSetter__ 方法

例如,登入時,會得到敏感資料

當用戶開啟垃圾郵件,在不知情的情況,登入另一個駭客網

駭客會透過瀏覽器漏洞,透過<script>

CVT2HUGO: tag 發送一個請求到用戶登入過的 A 網站
<script type="text/javascript"> 
var o = [];
Object.prototype.__defineSetter__('Id', function (obj) {
    console.log(obj);
});
Object.prototype.__defineSetter__('Balance', function (obj) {
    console.log(obj);
});
</script> 
<script  id="myJson" type="application/json" src="http://mywebsite.com/getjson"></script> 

這個請求會夾帶著用戶 cookie 以 GET 的方式前往 A 網站

由於 A 網站會返回 Array 格式,返回後可以被當作 javascript 執行 (如果返回的是 json object {} 則不會被執行)

惡意網站只要再透過 Object 的 prototype 裡的 __defineSetter 方法,複寫 setter 預設的屬性

例如,將每一個物件都增加一個 Id 屬性

Object.prototype.__defineSetter__('Id', function(obj){alert(obj);});

此時,用戶就成了受害者

雖然,這些年來,Json Hijacking 已經陸續被修復

但是,近年在 ES 6 的 Proxy 又讓 Array 能被修改

例如:

<script>
Object.setPrototypeOf(__proto__,new Proxy(__proto__,{
    has:function(target,name){
        alert(name.replace(/./g,function(c){ c=c.charCodeAt(0);return String.fromCharCode(c>>8,c&0xff); }));
    }
}));
</script>
<script charset="UTF-16BE" src="http://mywebsite.com/getjson"></script>

在目前主流瀏覽器多數也已修正這項功能

預防方式

雖然多數主流瀏覽器已經修正修改 array 屬性已進行 Json Hijacking 的漏洞

但是,基本的防範仍有必要

基本預防 Json Hijacking 方式如下:

  • 敏感資料改用 POST 方式
  • 返回的 json 資料格式,最外層以 {} 物件,而不要用 [] 陣列的格式

例如

可以被執行

[{"object": "inside an array"}]

不可被執行

{"object": "not inside an array"}

不可被執行

{"result": [{"object": "inside an array"}]}

另外,目前在 facebook 再返回的son 會再加上 無限迴圈執行功能,以防範 Json Hijacking

for (;;);

在取得資料之後,會先移除掉無限迴圈的部分,在進行 json parse

補充

Github 提供了一個 JsonHijackDemo ,可以從 CodeHaacks solution from GitHub 取得

單字:

unwitting 不知情的

vulnerability 漏洞

spams 垃圾郵件

victim 受害者