反射型XSS 是指應用程式透過Web 請求取得不可信賴的數據,在未檢驗資料是否有惡意程式碼的情況下,便將其傳送給了Web 使用者。反射型XSS 一般由攻擊者建構帶有惡意程式碼參數的URL,當URL 位址被開啟時,特有的惡意程式碼參數被HTML 解析、執行,它的特點是非持久化,必須使用者點擊帶有特定參數的鏈接才能引起。小編以JAVA 語言原始碼為例,分析CWE ID 80: Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic 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。 |
範例源自於Samate Juliet Test Suite for Java v1.3 (https://samate.nist.gov/SARD/testsuite.php),來源檔案名稱:CWE80_XSS__CWE182_Servlet_URLConnection_03.java。
#上述範例程式碼操作是取得使用者的年齡,在第40行建立連接對象,在第44行創建輸入流獲得urlConnection
物件回應的內容,在第52行從緩衝流中讀取一行數據,在第100行中,將獲得的數據去除所有的 <script></script>
標籤並向頁面輸出處理後的數據,即使過濾了<script></script>
標籤,但仍然可以使用其他html
標籤,在這裡建構了惡意的url
,但網站未做防護時,頁面會讀取到document.cookie
的內容並輸入到頁面。這樣就造成了反射型 XSS。
使用360程式碼衛兵對上述範例程式碼進行偵測,可以檢出「反射型XSS」缺陷,顯示等級為高。從追蹤路徑中可以分析出資料的污染源以及資料流向,在程式碼行第100行報出缺陷,如圖1所示:
圖1:反射XSS 偵測範例
在上述修復程式碼中,由於頁面輸出的內容為使用者的年齡,在第96行,對回應的內容轉換為數字,這樣就過濾了其它html 的字符,即使存在字符,代碼會報出異常,並不會造成反射型XSS 的發生。
使用360程式碼衛兵對修復後的程式碼進行偵測,可以看到已不存在「反射型XSS」缺陷。如圖2:
圖2:修正後偵測結果
要避免反射型XSS,需要注意以下幾點:
(1) 對使用者的輸入進行合理驗證(如年齡只能是數字),對特殊字元(如