動態

詳情 返回 返回

邏輯漏洞挖掘之XSS漏洞原理分析及實戰演練 | 京東物流技術團隊 - 動態 詳情

一、前言

2月份的1.2億條用户地址信息泄露再次給各大公司敲響了警鐘,數據安全的重要性愈加凸顯,這也更加堅定了我們推行安全測試常態化的決心。隨着測試組安全測試常態化的推進,有更多的同事對邏輯漏洞產生了興趣,本系列文章旨在揭秘邏輯漏洞的範圍、原理及預防措施,逐步提升大家的安全意識。作為開篇第一章,本文選取了廣為熟知的XSS邏輯漏洞進行介紹。

二、XSS漏洞介紹

1.XSS漏洞的定義

跨站腳本(Cross Site Script),為了不和層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆,故將跨站腳本縮寫為XSS。跨站腳本(以下簡稱XSS)通常發生在客户端,攻擊者在Web頁面中插入惡意JavaScript代碼(也包括VBScript和ActionScript代碼等),用户瀏覽此頁面時,會執行這些惡意代碼,從而使用户受到攻擊。

2.XSS主要攻擊形式

  • 存儲型跨站腳本攻擊

攻擊者利用應用程序提供的添加、修改數據功能,將惡意數據存儲到服務器中,當其他用户瀏覽展示該數據的頁面時,瀏覽器會執行頁面嵌入的惡意腳本,從而達到惡意攻擊的目的,這種攻擊是持久化的。

  • 反射型跨站腳本攻擊

攻擊者發送一個URL給用户並誘導其訪問,瀏覽器會執行頁面嵌入的惡意腳本,從而達到惡意攻擊的目的,這種攻擊只執行一次,是非持久化的。

  • DOM跨站腳本攻擊

在Html頁面中,未通過規範JavaScript直接操作用户輸入的數據,當攻擊者插入一段惡意代碼,在頁面最終展示會執行惡意腳本,從而達到惡意攻擊的目的。

3.XSS漏洞危害

  • 信息竊取(如盜取用户cookie,偽造用户身份登錄)
  • 釣魚欺詐
  • 蠕蟲攻擊

三、XSS漏洞原理分析

四、XSS漏洞實例分析

1.存儲型XSS

  • 漏洞位置其實為兩處,此處類似iframe嵌⼊,原url為test.jd.com,所以直接影響兩個站

  • 漏洞證明:發送如下數據包,即可插⼊存儲型XSS

2.反射型XSS

  • 輸入萬能語句 <script>alert()</script>後並沒有彈窗,查看源碼可見 <>被轉義了

  • 在input標籤的value處,沒有將我們輸入的內容進行嚴格過濾,所以手動閉合value,再執行腳本 "><script>alert()</script>

五、XSS漏洞防範意見

1.存儲型和反射型 XSS

存儲型和反射型 XSS 都是在服務端取出惡意代碼後,插入到響應 HTML 裏的,攻擊者刻意編寫的“數據”被內嵌到“代碼”中,被瀏覽器所執行。預防這兩種漏洞,有兩種常見做法:

1)改成純前端渲染,把代碼和數據分隔開

對 HTML 做充分轉義。瀏覽器先加載一個靜態 HTML,此HTML 中不包含任何跟業務相關的數據。然後瀏覽器執行 HTML 中的 JavaScript。JavaScript 通過 Ajax 加載業務數據,調用 DOM API 更新到頁面上。在純前端渲染中,我們會明確的告訴瀏覽器:下面要設置的內容是文本(.innerText),還是屬性(.setAttribute),還是樣式(.style)等等。瀏覽器不會被輕易的被欺騙,執行預期外的代碼了。

但純前端渲染還需注意避免 DOM 型 XSS 漏洞(例如 onload 事件和 href 中的 javascript:xxx 等,請參考下文”預防 DOM 型 XSS 攻擊“部分)。在很多內部、管理系統中,採用純前端渲染是非常合適的。但對於性能要求高,或有 SEO 需求的頁面,我們仍然要面對拼接 HTML 的問題。

2)轉義 HTML

如果拼接 HTML 是必要的,就需要採用合適的轉義庫,對 HTML 模板各處插入點進行充分的轉義。

常用的模板引擎,如 doT.js、ejs、FreeMarker 等,對於 HTML 轉義通常只有一個規則,就是把 & < >

" ’ / 這幾個字符轉義掉.

2.預防 DOM 型 XSS 攻擊

DOM 型 XSS 攻擊,實際上就是網站前端 JavaScript 代碼本身不夠嚴謹,把不可信的數據當作代碼執行了。

在使用 .innerHTML、.outerHTML、document.write() 時要特別小心,不要把不可信的數據作為 HTML 插到頁面上,而應儘量使用 .textContent、.setAttribute() 等。

如果用 Vue/React 技術棧,並且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 階段避免 innerHTML、outerHTML 的 XSS 隱患。

DOM 中的內聯事件監聽器,如 location、onclick、onerror、onload、onmouseover 等,a 標籤的 href 屬性,JavaScript 的 eval()、setTimeout()、setInterval() 等,都能把字符串作為代碼運行。如果不可信的數據拼接到字符串中傳遞給這些 API,很容易產生安全隱患,請務必避免。

3.其他 XSS 防範措施

雖然在渲染頁面和執行 JavaScript 時,通過謹慎的轉義可以防止 XSS 的發生,但完全依靠開發的謹慎仍然是不夠的。以下介紹一些通用的方案,可以降低 XSS 帶來的風險和後果。

1)Content Security Policy

嚴格的 CSP 在 XSS 的防範中可以起到以下的作用:

禁止加載外域代碼,防止複雜的攻擊邏輯。

禁止外域提交,網站被攻擊後,用户的數據不會泄露到外域。

禁止內聯腳本執行(規則較嚴格,目前發現 GitHub 使用)。

禁止未授權的腳本執行(新特性,Google Map 移動版在使用)。

合理使用上報可以及時發現 XSS,利於儘快修復問題。

關於 CSP 的詳情,請關注前端安全系列後續的文章。

2)輸入內容長度控制

對於不受信任的輸入,都應該限定一個合理的長度。雖然無法完全防止 XSS 發生,但可以增加 XSS 攻擊的難度。

3)其他安全措施

HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入後也無法竊取此Cookie。

作者:京東物流 範文君
來源:京東雲開發者社區 自猿其説 Tech 轉載請註明來源
user avatar lenglingx 頭像 wanshoujidezhuantou 頭像 werbenhu 頭像 anjingdexiaoyanyao_ciaxxr 頭像 yangy5hqv 頭像 beverly0 頭像 tinygeeker 頭像 itxiaoma 頭像 ddup365 頭像 xinliangcoder 頭像 qcloudcommunity 頭像 mougeyewan 頭像
點贊 14 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.