【缺陷周話】第10期:反射型 XSS
1、反射型 XSS
反射型 XSS 是指應用程式通過 Web 請求獲取不可信賴的資料,在未檢驗資料是否存在惡意程式碼的情況下,便將其傳送給了 Web 使用者。反射型 XSS 一般由攻擊者構造帶有惡意程式碼引數的 URL,當 URL 地址被開啟時,特有的惡意程式碼引數被 HTML 解析、執行,它的特點是非持久化,必須使用者點選帶有特定引數的連結才能引起。本文以 JAVA 語言原始碼為例,分析 CWE ID 80: Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS) (http://cwe.mitre.org/data/definitions/80.html) 樣本反射型 XSS 漏洞產生的原因以及修復方法。 詳見:
- CWE ID 79: ImproperNeutralization of Input During Web Page Generation (‘Cross-site Scripting’) (http://cwe.mitre.org/data/definitions/79.html)
- CWE ID 80:Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS) (http://cwe.mitre.org/data/definitions/80.html)
- CWE ID 81: Improper Neutralization of Scriptin an Error Message Web Page (http://cwe.mitre.org/data/definitions/81.html)
- CWE ID 82: Improper Neutralization of Scriptin Attributes of IMG Tags in a Web Page (http://cwe.mitre.org/data/definitions/82.html)
- CWE ID 83: Improper Neutralization of Scriptin Attributes in a Web Page(http://cwe.mitre.org/data/definitions/83.html)
2、 反射型 XSS 的危害
當用戶訪問一個帶有 XSS 程式碼的 URL 請求時,伺服器端接收資料後處理,然後把帶有 XSS 程式碼的資料傳送到瀏覽器,瀏覽器解析這段帶有XSS程式碼的資料後,造成 XSS 漏洞,可能導致竊取目標網站的 Cookie 到攻擊者的伺服器上,讀取使用者未公開的資料或Click劫持實施釣魚攻擊等。從2018年1月至11月,CVE 中共有126條漏洞資訊與其相關。部分漏洞如下:
CVE | 漏洞概述 |
---|---|
CVE-2018-19091 | tianti 是一款使用 Java 編寫的免費的輕量級 CMS 系統,目前提供了從後臺管理到前端展現的整體解決方案。其中 tianti 2.3 通過 tianti-module-admin / user /list userName 引數在使用者管理模組中存在反射型 XSS 漏洞。 |
CVE-2018-14929 | Matera Banco 1.0.0 容易受到多個反射型 XSS 的影響,正如 /contingency/web/index.jsp(又名主頁)url 引數所示。 |
CVE-2018-12996 | ZohoManageEngine Applications Manager 提供了監視和管理 J2EE 底層結構、J2EE應用的解決方案。在 Zoho ManageEngine Applications Manager 13(Build13800)中反射型跨站指令碼(XSS)漏洞允許遠端攻擊者通過引數 ‘method’ 向GraphicalView.do 注入任意 Web 指令碼或 HTML。 |
CVE-2018-12090 | LAMS 是由澳大利亞 Macquarie 大學,LAMS 國際有限公司和 LAMS 基金會聯合開發出來的一個基於 JAVA 的新一代學習軟體。在 3.1 之前的 LAMS 中存在未經身份驗證的反射型跨站指令碼(XSS),允許遠端攻擊者在 forgetPasswordChange.jsp?key = 密碼更改期間通過操作未經過規範的 GET 引數來引入任意 JavaScript。 |
3、示例程式碼
示例源於 ofollow,noindex" target="_blank">Samate Juliet Test Suite for Java v1.3 ,原始檔名:CWE80_XSS__CWE182_Servlet_URLConnection_03.java。
3.1缺陷程式碼
上述示例程式碼操作是獲取使用者的年齡,在第40行建立連線物件,在第44行建立輸入流獲得urlConnection物件響應的內容,在第52行從緩衝流中讀取一行資料,在第100行中,將獲得的資料去除所有的<script>標籤並向頁面輸出處理後的資料,即使過濾了<script>標籤,但仍然可以使用其他html標籤,在這裡構造了惡意的url,但網站未做防護時,頁面會讀取到document.cookie的內容並輸入到頁面。這樣就造成了反射型 XSS。
使用360程式碼衛士對上述示例程式碼進行檢測,可以檢出“反射型XSS”缺陷,顯示等級為高。從跟蹤路徑中可以分析出資料的汙染源以及資料流向,在程式碼行第100行報出缺陷,如圖1所示:
圖1:反射型 XSS 檢測示例
3.2 修復程式碼
在上述修復程式碼中,由於頁面輸出的內容為使用者的年齡,在第96行,對響應的內容轉換為數字,這樣就過濾了其它 html 的字元,即使存在字元,程式碼會報出異常,並不會造成反射型 XSS 的發生。
使用360程式碼衛士對修復後的程式碼進行檢測,可以看到已不存在“反射型XSS”缺陷。如圖2:
圖2:修復後檢測結果
4 、如何避免反射型 XSS
要避免反射型 XSS,需要注意以下幾點:
(1) 對使用者的輸入進行合理驗證(如年齡只能是數字),對特殊字元(如 <、>、’、”等)以及<script>、javascript 等進行過濾。
(2) 根據資料將要置於 HTML 上下文中的不同位置(HTML 標籤、HTML 屬性、JavaScript 指令碼、CSS、URL),對所有不可信資料進行恰當的輸出編碼。
(3) 設定HttpOnly屬性,避免攻擊者利用XSS漏洞進行Cookie劫持攻擊。在 JavaEE 中,給Cookie新增HttpOnly的程式碼如下: