1.1. jQuery 1.6.1
1.6.1版本的jQuery代碼正則為:
quickExpr =/^(?:[^<]*(<[wW]+>)[^>]*$|#([w-]*)$)/,
此處正則表達式存在缺陷,導致產生Dom型XSS 漏洞。
1.2. jQuery 1.7.2
1.7.2版本的jQuery代碼正則為:
quickExpr =/^(?:[^#<]*(<[wW]+>)[^>]*$|#([w-]*)$)/,
1.3. jQuery 1.11.2
jQuery 1.11.3版本的jQuery代碼正則為:
rquickExpr =/^(?:s*(<[wW]+>)[^>]*|#([w-]*))$/,
仍然可以被繞過:
1.4. jQuery 2.x
jQuery 2.x版本的jQuery代碼正則為:
rquickExpr =/^(?:#([w-]+)|(w+)|.([w-]+))$/,
通過調試即可發現 Chrome 未對 location.hash 部分進行 URL 編碼處理進入函數,而 Safari 會經過 URL 編碼進入函數。
rquickExpr =/^(?:#([w-]+)|(w+)|.([w-]+))$/,
依然可以使用html5 的一些特性,引發錯誤並 彈框:
1.5. 結論
目前最新版本的jQuery有2個版本,分別是1.11.3和2.1.4,其中1.11.3支持低版本IE瀏覽器,2.1.4的不支持低版本IE瀏覽器,但這2個版本的jQuery目前的正則表達式都無法完善的過濾危險字符,依然會引起DOM型的XSS跨站漏洞。
1.6. 安全建議
臨時解決方案:
暫時隱藏jQuery版本信息,避免被攻擊者識別出版本號;
為應用系統制定統一的、影響全局的危險字符黑名單,發現輸入中存在危險字符時直接返回固定的錯誤頁面。
正式解決方案:
等待jQuery發布新的修復版本后升級。
漏洞官方修復介紹:https://bugs.jquery.com/ticket/9521