2007年三月由Fortify公司發表了一篇技術文件,描述JavaScript劫持(JavaScript Hijacking)攻擊如何利用Ajax與JSON搭配來竊取資料。這種攻擊是跨站(Cross-Site)攻擊的一種變形,原理與XSS(Cross-Site Script,跨站指令攻擊)以及CSRF(Cross-Site Request Forgery,偽造跨站要求)類似,要實現這種攻擊需要受害網站、惡意網站、以及使用者瀏覽器等三方同時搭配,有別於一般透過入侵網站竊取資料的方式。
Ajax與JSON
Web 2.0是近年來的熱鬧話題,近一年來有許多成功的併購案都和它相關,彷彿重現當初網路泡沫時的熱潮。Web 2.0事實上是一種讓使用者高度參與的網路應用,而不是新的網路技術。在Web 2.0應用到的技術中,與JavaScript Hijacking有關的就是Ajax(Asynchronous JavaScript and XML)以及JSON(JavaScript Object Notation)。
首先來聊聊Ajax。傳統網頁要靠使用者按下更新(Refresh)鍵以觀看最新的網頁內容,但是像Gmail這樣應用Ajax的站臺,不需要使用者親自按更新鍵也能見到最新的收信夾資料,因為它能夠將用戶端與伺服器端連結起來,在不更新整個頁面的前提下,更新需要的資訊,也使得網站伺服器能夠更快速地回應。因為傳統的網站運作,是依靠瀏覽器抓取網頁並顯示給使用者,因此需要使用者手動按下更新鍵來觸發更新的行為。但是Ajax技術是使用JavaScript程式,在使用者端與伺服器端自行溝通,當有新資料的時候,JavaScript程式會自動抓取回來並且顯示在頁面上。這也是Ajax命名中所謂「非同步(Asynchronous)」的原因。而JSON其實是 JavaScript 的變數定義語法,是一種輕量級且可讀性高的資料轉換格式,規範在IETF RFC-4627之中。
Ajax架構下雖然可以使用XML,但是若傳遞資料的格式很簡單,使用XML會有「殺雞用牛刀」的感覺。因為XML既然是一種makeup language,定義起來就很嚴謹,如同HTML一樣需要表頭及表尾。若是傳遞的資料格式不太複雜,利用JSON其實經濟地多。而Fortify公司所作的示範,就是在Ajax架構下,利用JSON陣列,發動JavaScript Hijacking攻擊。
實現JavaScript Hijacking的具體方式
事實上,JavaScript Hijacking並不會對傳統形式的網站造成危害,它只能針對那些以JavaScript傳遞資料的網站產生威脅。要實現這種攻擊,需要受害網站、惡意網站、以及使用者瀏覽器等三方同時搭配,竊取資料的過程中也不需要入侵受害網站,或是在受害網站中植入任何的程式碼。
它與CSRF的運作模式類似。要完成JavaScript Hijacking,首先使用者瀏覽器要登入受害網站,登入並且取得cookie。此時,要是使用者又開了另一個瀏覽視窗,並且瀏覽到含有JavaScript Hijacking劫持攻擊的惡意網站(或是被插入惡意程式碼的網站),就可能因為執行惡意網站上面的JavaScript程式,進而將個人資料由受害網站傳送到惡意網站指定的地方。若是CSRF攻擊,則是指使瀏覽器傳送假造的資料。總而言之,JavaScript Hijacking是利用弱點「偷取資料」,而CSRF攻擊則是利用弱點「傳送假造資料」。
目前在網路上面找到的JavaScript Hijacking的攻擊程式大多利用覆寫 JavaScript 內建 Object 類別的建構子內容來達成。也就是說,當瀏覽器執行惡意網站上面的JavaScript程式時,會在登入受害網站的情況之下,呼叫惡意網站上面被覆寫過的程式碼。實際JavaScript Hijacking的概念驗證程式碼(Proof of Concept)可以在Fortify的技術文件中找到。
避免此類攻擊的方法
防制JavaScript Hijacking的方法目前有幾種:
一、在資料傳遞時,將cookie或是某些特別的欄位加入。因為惡意網站無法假造這種請求。
二、 檢查 HTTP表頭中的Referer欄位,我們可以知道是否是來自相同網域的請求。但是由於Referer可以經由一些方法變造,所以不是一個很保險的作法。你可以參考http://webappsec.org/lists/websecurity/archive/2006-07/msg00069.html
三、因為惡意網站使用<script>標籤來實行跨站攻擊,而<script> 只會產生HTTP GET請求,因此可以在伺服端設下限制,只回應HTTP POST的請求。
四、伺服器將傳回的JSON資料加以變造,使得JavaScript沒辦法直接執行。例如在JSON資料前後加上注釋符號,便可令 JavaScript 視之為一般注釋,而不加以執行,如此便不會喚起 Hijacking 程式碼。
五、 採用XML來傳遞資料,而非使用JSON。
隨著Web 2.0的網站越來越多,這種利用Ajax架構下弱點的攻擊,也會持續浮出水面。除了網站管理者要注意,所有上網的使用者也要小心。
參考資料:《iThome企業資安技術應用專刊》作者/威播科技產品開發處副總劉榮太
-
‧
-
‧
-
‧
相關問答
- Google提供幾個Ajax Libraries的Hosting服務
- 用JavaScript處理RSS的好幫手-Google AJAX Feed API
- 看jQuery作者John Resig談進階JavaScript
- 使用Ajax的網頁安全性
- 四篇深入淺出AJAX on JAVA(DWR)的教學文章
- ASP.NET AJAX Framework 觀念與實作篇(OneNet魔力小子)
- ASP.NET AJAX Framework 觀念與實作篇-(OneNet魔力小子)
- VS2008 + AJAX 實作分享
- Douglas Crockford關於Ajax效能的演講
- 有趣的V8 Javascript Engine
- Zend Framework將整合dojo做為ajax開發的工具
- Mozilla釋出TraceMonkey加速JavaScript
- 請推薦適合使用在PHP的Ajax框架?
- MSDN台中研討會
- 寫物件導向風格的JavaScript
- 利用Firebug的console功能作JavaScript偵錯
- 下載電子書Adobe AIR for JavaScript Developers Pocketguide
- JavaScript函setTimeout的scope
- JavaScript如何在不同網站之間傳遞資料









