jQuery框架漏洞全總結及開發建議

  • 2019 年 10 月 10 日
  • 筆記

一、jQuery簡介

jQuery是一個快速、簡潔的JavaScript框架,是一個豐富的JavaScript程式碼庫。jQuery設計的目的是為了寫更少的程式碼,做更多的事情。它封裝JavaScript常用的功能程式碼,提供一種簡便的JavaScript設計模式,優化HTML文檔操作、事件處理、動畫設計和Ajax交互。

據一項調查報告,在對433,000個網站的分析中發現,77%的網站至少使用了一個具有已知安全漏洞的前端JavaScript庫,而jQuery位列榜首,而且遠遠超過其他庫。但事實上這些庫有可用的不存在漏洞的最新版本,只是很少有開發人員會更新,一方面安全意識不夠,另一方面更新需考慮兼容性問題。

二、漏洞研究

2.1 DOM-based XSS

0x01 概述

在JQuery的諸多發行版本中,存在著DOM-based XSS(跨站腳本攻擊的一種)漏洞,易被攻擊者利用。漏洞原因在於過濾用戶輸入數據所使用的正則表達式存在缺陷,可能導致LOCATION.HASH跨站漏洞。這也是最為被大眾熟知的jQuery的一個漏洞。

此外,1.12.0之前的jQuery UI庫也可以通過對話框函數的closeText參數進行DOM-based XSS攻擊。

漏洞編號

CVE-2016-7103、CVE-2015-9251、CVE-2014-6071、CVE-2012-6708、CVE-2011-4969

影響版本:1.x系列版本等於或低於1.12的jQuery

2.x系列版本等於或低於2.2的jQuery

0x02 漏洞復現

1.6.1版本:

xss#<img src=1 onerror=alert('jayway')>

1.7.2版本:

xss#<img src=1 onerror=alert('jayway')>

1.11.3版本:

xss#<img src=1 onerror=alert('jayway')>

2.x版本:

Chrome 未對 location.hash 部分進行 URL 編碼處理進入函數,而 Safari 會經過 URL 編碼進入函數。依然可以使用html5 的一些特性,引發錯誤並彈框,只是局限於Safari 瀏覽器。

0x03 漏洞原理

1.6.1版本的jQuery程式碼正則為:

quickExpr = /^(?:[^<]*(<[wW]+>)[^>]*$|#([w-]*)$)/,

1.7.2版本的jQuery程式碼正則為:

quickExpr =/^(?:[^#<]*(<[wW]+>)[^>]*$|#([w-]*)$)/,

1.11.3版本的jQuery程式碼正則為:

rquickExpr =/^(?:s*(<[wW]+>)[^>]*|#([w-]*))$/,

2.x系列jQuery程式碼正則為:

rquickExpr = /^(?:#([w-]+)|(w+)|.([w-]+))$/,

總結起來,DOM-based XSS漏洞在各個版本都可成功的原因在於jquery本身對於正則表達式都無法完善地過濾危險字元,但前提是源碼使用了$(location.hash)。故觸發條件較為苛刻,且只可觸發DOM型xss漏洞。

0x04 開發建議

1)臨時解決方案:

暫時隱藏jQuery版本資訊,避免被攻擊者識別出版本號,但不建議採取此辦法;

2)正式解決方案:

建議將jQuery版本升級至1.9.x或以上版本3.4.0,升級jquery-ui版本到1.12.0以上。不過升級有風險,因為版本兼容的問題,jQuery官方推薦了jQuery Migrate 庫來解決jQuery升級問題。

3)程式碼層解決方案:

1. 過濾用戶輸入的內容

檢查用戶輸入的內容中是否有非法內容。如<>(尖括弧)、"(引號)、 '(單引號)、%(百分比符號)、;(分號)、()(括弧)、&(& 符號)、+(加號)等。

2. 嚴格控制輸出

可以利用下面這些函數對出現xss漏洞的參數進行過濾

1、htmlspecialchars() 函數,用於轉義處理在頁面上顯示的文本。

2、htmlentities() 函數,用於轉義處理在頁面上顯示的文本。

3、strip_tags() 函數,過濾掉輸入、輸出裡面的惡意標籤。

4、header() 函數,使用header("Content-type:application/json"); 用於控制 json 數據的頭部,不用於瀏覽。

5、urlencode() 函數,用於輸出處理字元型參數帶入頁面鏈接中。

6、intval() 函數用於處理數值型參數輸出頁面中。

7、自定義函數,在大多情況下,要使用一些常用的 html 標籤,以美化頁面顯示,在這樣的情況下,要採用白名單的方法使用合法的標籤顯示,過濾掉非法的字元。

各語言示例:

2.2 jQuery File Upload插件文件上傳漏洞

0x01 概述

jQuery File Upload是文件上傳小工具,包含多個文件選擇:拖放支援,進度條,驗證和預覽影像,jQuery的音頻和影片。支援跨域,分塊和可恢復文件上傳以及客戶端影像大小調整。適用於支援標準HTML表單文件上載的任何伺服器端平台(PHP,Python,Ruby on Rails,Java,Node.js,Go等)。目前該插件在GitHub最受歡迎的jQuery項目中位居第二位,僅次於jQuery框架本身。

該漏洞早在2016年就已經被廣泛利用,它允許攻擊者向伺服器上傳惡意js文件甚至後門和 Web shell,從而控制伺服器。

漏洞編號:CVE-2018-9206

影響版本:9.22.1之前的所有jQuery文件上傳版本

0x02 漏洞復現

測試環境搭建及驗證POC:

https://github.com/lcashdol/Exploits/tree/master/CVE-2018-9206

在線漏洞環境:

https://github.com/vulnspy/jQuery-File-Upload-9.22.0

此漏洞被用於掛馬進行博彩網站跳轉,一次攻擊實例如圖:

0x03 漏洞原理

漏洞原因是Apache的一次升級,在版本2.3.9中禁用了對.htaccess的支援以提高性能(伺服器不必在每次訪問控制器時檢查此文件)並防止用戶覆蓋安全功能在伺服器上配置, 副作用是這次升級移除了安全控制措施。

0x04 開發建議

1、將此插件升級到9.22.1版本。

2、對可上傳的文件類型進行嚴格限制。

2.3 原型污染漏洞

0x01 概述

不久前發布的 jQuery 3.4.0 除了常規更新外,更重要的是修復了一個稱為「原型污染(prototype pollution)」的罕見安全漏洞。

原型污染就是指由攻擊者控制的屬性可被注入對象,之後或經由觸發 JavaScript 異常引發拒絕服務,或篡改該應用程式源程式碼從而強制執行攻擊者注入的程式碼路徑。

漏洞編號:CVE-2019-11358

影響版本

0x02 漏洞原理

基礎知識:

JavaScript 對象就跟變數一樣,但它不是存儲一個值(var car =「Fiat」),而是可以包含基於預定義結構的多個值 (var car ={type:"Fiat", model:"500", color:"white"})。

prototype 定義了 JavaScript 對象的默認結構和默認值,因此在沒有為對象賦值時應用程式也不會崩潰。但如果攻擊者從 JavaScript 對象的 prototype 入手,攻擊者可通過將其控制的 prototype 注入對象,然後通過觸發 JavaScript 異常導致拒絕服務(denial of service),或者篡改應用程式源程式碼以注入攻擊者的程式碼路徑。最終的結果可能就是導致應用程式崩潰或劫持應用程式。

漏洞原理:

例如,構建一款應用程式時,用戶經授權能夠發送和保存時一樣的JSON有效負載,如下:

此時需要以遞歸方式克隆一個對象,通過如下方式::

如果從資料庫中獲取的用戶對象myObject並未在isAdmin 屬性中設置任何值,那麼用戶對象本質上是未明確的。在這種情況下,訪問 if 從句中的 isAdmin 屬性將要求訪問user對象原型鏈中的父對象,即 Object,它現在即被污染並且包含被值為 true的 isAdmin 屬性。這樣,不安全的遞歸合併操作,加上 JSON.parse 的運作方式將導致潛在的原型鏈污染後果。

在3.4.0之前的jQuery,如在Drupal,Backdrop CMS和其他產品中使用,由於Object.prototype污染而錯誤處理jQuery.extend(true,{},…)。如果未過濾的源對象包含可枚舉的__proto__屬性,則它可以擴展到Object.prototype。

0x03 開發建議

(1)jQuery version 3.x 修復方案

升級到最新的3.4.0版本,帶有修復程式的jQuery 3.4.0下載地址:

https://blog.jquery.com/2019/04/10/jquery-3-4-0-released/。

(2)jQuery version 2.x 修復方案

(3)jQuery version 1.x 修復方案

2.4 Denial of Service (DoS)漏洞

0x01 概述

受影響的軟體包版本容易受到拒絕服務(DoS)的影響,因為刪除了一個小寫屬性名稱的邏輯。使用布爾屬性的混合類名稱的任何屬性getter都會進入無限遞歸,超過堆棧調用限制。

漏洞編號:CVE-2016-10707

影響版本:jQuery 3.0.0-rc1

0x02 漏洞原理

由於刪除了一個小寫屬性名稱的邏輯,jQuery3.0.0-rc.1容易受到拒絕服務(DoS)的攻擊。使用布爾屬性的混合類名稱的任何屬性getter都會進入無限遞歸,超過堆棧調用限制。

0x03 開發建議

升級jquery到3.0.0或更高版本。

三、總計

總結起來,對於jQuery的漏洞修復和防範,主要體現在對開發中所調用的jQuery版本的重視。儘可能使用不含漏洞的高版本JQuery,對於已開發的程式,需採取的方案有:

1)採取隱藏版本號的方法增加攻擊難度;

2)對已存在的jQuery進行升級和打修補程式;

3)在程式碼層對用戶輸入數據進行嚴格限制,這也是防禦的根本。

附:

1、通過下列鏈接查看存在漏洞的jQuery版本:

http://research.insecurelabs.org/jquery/test/

2、通過下列鏈接查看漏洞詳情:

https://bugs.jquery.com/ticket/11290