前言
jQuery是一個JavaScript UI框架,它為許多DOM操作功能提供了一個抽象層。它為開發人員提供了一個友好的界面,可以快速,動態地更新DOM,而無需重新加載整個頁面。這是 jQuery 的優點及概念。
但 jQuery 在有着諸多優點的同時,它本身也存一些安全問題,而所有的 jQuery 安全問題都圍繞着那些被濫用的功能,jQurey 團隊修改了行為來保護開發人員,下面來看看常見的 jQuery 安全問題的風險。
一、jQuery基礎 - $()函數
$() 與 jQuery() 函數的最常見的書寫形式是一樣的,它返回一個jQuery對象:本質上要寫入DOM的內容塊。
在大多數情況下,jQuery函數將使用選擇器,元素或對象作為參數。由哈希(#)表示的選擇器是當前DOM中現有html內容的標識符。在下面的例子中,我們將使用jQuery html()函數來修改#myDivTag選擇器的元素:
注意 “我的舊div標簽文本!” 不顯示。jQuery在運行時修改DOM來替換我們的div元素的文本:
再看看下面的例子:
根據這個例子可以看到,jQuery函數類似於getElementById()函數。但是有一個重要的區別:jQuery接受的不僅僅是一個選擇器ID,包括HTML和腳本內容。比如:
二、jQuery 的 “XSS漏洞”
jQuery框架中沒有已知的直接XSS漏洞(不包括jQuery插件)。但對於不受信任的內容引入到 jQuery 時,DOM (innerHTML,document.write()等)可能會被修改。
以下是最常見的漏洞代碼示例:
在下面的頁面中,我們可以直接在瀏覽器DOM中引入任意腳本,甚至繞過Chrome的 XSS審核:
這個XSS向量是很常見的,jQuery最終改變了選擇器處理特性,為防止這種攻擊。我們阻止以“#”開始的HTML字符串,並從window.location.hash 中開始阻止 XSS
模擬XSS問題:Bug 9521 - $("#<img src=x onerror=...>")
在以下使用jQuery 1.6.1的例子中,模擬了XSS錯誤。這將以#字符開頭,從location.hash屬性中消耗的腳本:
代碼成功執行。
在下面的示例中,我們將jQuery升級到1.6.3並運行相同的代碼:
代碼不再運行,也就是說 jQuery-1.6.3 這個版本可以阻止像剛剛這種:Bug 9521 - $("#<img src=x onerror=...>") 的問題。
模擬XSS問題:Bug 11290 - $("element[attribute='<img src=x onerror=...>'")
前面提到的 jQuery接受的不僅僅是一個選擇器ID,還包括HTML和腳本內容。 jQuery可能會錯誤地識別一個包含 < 作為HTML片段的選擇器,並嘗試解析並創建相關的元素
如圖:我們引入了 jQuery-1.6.3.js 版本,並定義了<div data-val='<img src="x" onerror="console.log(xss!)">'></div>,最后執行結果如下:會發現 Bug 11290 代碼被執行了
但當我換成 jQuery-1.12.4.js 版本時,Bug 11290 代碼不會執行,而會報錯:
三、jQuery的AJAX $ .get()響應處理弱點
jQuery ajax $ .get()函數(不要與.get()函數混淆)用於使您可能猜到的ajax GET請求。發現在1.12.0之前的版本會自動評估響應內容,如果包含在響應中,則可能會執行腳本。
此行為可能會促進應用程序中的兩個潛在漏洞。
- 將跨域請求交給不受信任域的應用程序可能會無意中執行腳本,否則可能會被視為安全內容。
- 如果可以將腳本注入到數據源中,則可以在XSS攻擊中利用對可信API端點的請求。
示例:當我們在頁面上發送請求:$.get('http://sakurity.com/jqueryxss') 時,攻擊者可能會用 type="text/javascript" 來回應我們,並寫上惡意的執行代碼,如:
模擬 $.get()響應 問題:jQuery issue 2432 - 3rd party $.get() auto executes if content type is text/javascript
test.html 頁面:
在 https://sakurity.com/jqueryxss 網站上惡意彈出一個層
最終 test.html 頁面執行效果:會執行並彈出 https://sakurity.com/jqueryxss 網站上聲明的惡意腳本
總結:
像幾乎所有的現代軟件一樣,jQuery旨在強大而多功能。有無數安全和合法的功能,在濫用時可能會導致安全漏洞。這里描述的jQuery問題都是軟件的結果,該軟件按照設計運行,但是被不正確地執行。
另附上鏈接:http://research.insecurelabs.org/jquery/test/ 可查看 jQuery 各版本關於 Bug 9521、Bug 11290、jQuery issue 2432 問題
本文參考文章鏈接:https://www.virtuesecurity.com/blog/jquery-security-model/