攻擊情境:駭客如何發動 XSS 攻擊
第一步:駭客找到可以注入程式碼的地方
駭客會找到一個正常的、受信任的網站。
駭客會尋找網站上「可以輸入內容」的地方。
例如:留言板、評論區、搜尋框、個人簡介欄位等。
第二步:駭客注入惡意程式碼
假設這個網站有一個留言功能,使用者可以自由輸入文字。
正常使用者會輸入:「這個產品很棒!」
但駭客會輸入一段惡意的程式碼。
如果網站沒有做好防護,這段程式碼就會被存進資料庫,並顯示在網頁上。
這時候,惡意程式碼就像一顆地雷,埋在網頁裡面,等待下一個訪客觸發。
第三步:受害者瀏覽網頁,惡意程式碼被執行
當其他使用者瀏覽這個頁面時,瀏覽器會載入頁面上的所有內容。
包括駭客注入的那段惡意程式碼。
你可能會問:「我只是瀏覽網頁而已,為什麼會執行程式碼?」
這是因為瀏覽器的運作方式。
當你打開一個網頁時,瀏覽器會自動讀取並執行網頁裡的所有程式碼。
這就像你打開一本有聲書,音樂會自動播放一樣。
你不需要按任何按鈕,瀏覽器就會幫你執行網頁裡的 JavaScript。
所以只要網頁裡藏有惡意程式碼,你一打開頁面就中招了。
這時候,網站就在不知不覺中成為駭客的幫兇。
網站本身是無辜的,但它變成了「惡意程式碼的傳播管道」。
關鍵在於:這段惡意程式碼是在「受信任的網站」的環境下執行的。
瀏覽器不知道這段程式碼是駭客注入的,它只知道「這是這個網站的程式碼,我應該執行它」。
這就是 XSS 攻擊的可怕之處。
為什麼叫做 XSS(Cross-Site Scripting)?
了解了攻擊原理後,我們來看看這個名字的意思。
Scripting(腳本)
「腳本」指的是一段可以被執行的程式碼。
在網頁的世界裡,最常見的腳本就是 JavaScript。
當瀏覽器看到網頁裡有 JavaScript 程式碼時,就會自動執行它。
駭客注入的惡意程式碼,就是一段「惡意的腳本」。
Cross-Site(跨站)
「跨站」是什麼意思呢?
先來看看「同站」的情況。
正常情況下,網頁裡的程式碼都是網站自己寫的。
例如,example.com 網站裡的程式碼,是 example.com 的開發者寫的。
這種情況叫做「同站」——程式碼來自同一個網站。
但 XSS 攻擊不一樣。
駭客把自己的程式碼「偷渡」到別人的網站裡。
例如,駭客把惡意程式碼塞進 example.com 的留言板。
這段程式碼不是 example.com 寫的,而是駭客從「外部」注入的。
這種「外部程式碼混入網站」的情況,就是「跨站」。
組合起來:Cross-Site Scripting
Cross-Site(跨站):惡意程式碼是從外部注入的,不是網站自己的
Scripting(腳本):注入的是可執行的程式碼
合在一起就是:駭客把惡意腳本注入到別人的網站,讓訪客的瀏覽器執行。
這就是 XSS(Cross-Site Scripting)的意思。
XSS 攻擊可以造成什麼危害?
一旦惡意程式碼在受害者的瀏覽器中執行,駭客可以做很多事情。
篡改網頁內容,欺騙使用者
駭客可以用 JavaScript 修改網頁上顯示的內容。
想像一下這個情境:
你登入了網路銀行,想要轉帳 10,000 元給朋友「王小明」。
你填好表單,確認畫面顯示「轉帳金額:10,000 元,收款人:王小明」。
看起來沒問題,你按下確認。
但實際上,駭客的程式碼早就在背後偷偷修改了表單的資料。
你「看到」的是轉給王小明,但「實際送出」的是轉給駭客的帳戶。
等你發現帳戶少了錢,錢早就被轉走了。
這就是篡改網頁的可怕之處:你眼睛看到的,不一定是真的。
竊取 Cookie,劫持使用者的登入狀態
還記得 Cookie 嗎?
當你登入一個網站時,伺服器會產生一個「Session ID」(會話識別碼),代表你的登入身份。
這個 Session ID 會被存放在瀏覽器的 Cookie 裡面。
之後每次你發送請求,瀏覽器都會自動帶上這個 Cookie,伺服器就知道「這是剛才登入的那個人」。
換句話說,誰拿到你的 Cookie,誰就能假冒你的身份。
那駭客要怎麼拿到你的 Cookie 呢?
這就要說到 JavaScript 和瀏覽器的關係了。
當 JavaScript 在網頁上執行時,它可以存取瀏覽器提供的各種功能。
其中一個功能就是「讀取 Cookie」。
JavaScript 只要執行 document.cookie,就能讀取到當前網站的所有 Cookie。
這是瀏覽器設計的正常功能,讓網站可以管理使用者的登入狀態。
但問題是:駭客注入的惡意程式碼也是 JavaScript。
它在「受信任的網站」環境下執行,自然也有權限讀取該網站的 Cookie。
於是駭客可以透過 JavaScript 讀取你的 Cookie,然後傳送到駭客自己的伺服器。
駭客拿到你的 Cookie 後,就可以「劫持」(Hijack)你的登入狀態。
如果這是你的銀行網站,駭客就可以用你的身份登入,把你的錢轉走。
如果這是電商網站,駭客就可以用你的身份購物,讓你付錢。
植入惡意軟體
駭客可以透過 JavaScript 觸發檔案下載。
想像一下這個情境:
你只是瀏覽一個購物網站的商品頁面。
突然間,瀏覽器跳出一個下載視窗,顯示「系統更新程式.exe」。
如果你不小心點了「執行」,惡意軟體就會安裝到你的電腦裡。
更狡猾的做法是,駭客會讓下載視窗看起來像是正常的系統通知:
「您的 Flash Player 已過期,請點擊更新」
很多人看到這種訊息就會直接點下去,結果電腦就被植入了木馬程式。
一旦惡意軟體進入你的電腦,駭客就可以:
監控你的鍵盤輸入,竊取所有密碼
存取你電腦裡的檔案
把你的電腦變成殭屍網路的一部分,用來攻擊其他人
導向釣魚網站
駭客可以透過 JavaScript 把你重新導向到另一個網站。
想像一下這個情境:
你在瀏覽某個論壇,點了一篇看起來很正常的文章。
頁面閃了一下,你發現自己還是在同一個論壇,但網頁顯示「您的登入已逾時,請重新登入」。
你沒多想,就輸入了帳號密碼。
但其實,你已經被導向到駭客做的假網站了。
這個假網站長得跟真的一模一樣,網址也很相似(例如把 forum.com 改成 forurn.com,把 m 換成 rn)。
你輸入的帳號密碼,全部都被駭客收走了。
這就是「釣魚攻擊」(Phishing)。
而 XSS 讓駭客可以在「你信任的網站」上發動釣魚攻擊,讓你更難察覺異常。
另一種攻擊方式:透過惡意連結
上面介紹的是「把程式碼存進網站,等人來看」的攻擊方式。
但駭客還有另一種手法:直接發送一個「帶有惡意程式碼的連結」給你。
這個連結可能透過 Email、簡訊、或社群媒體傳送。
連結看起來像是正常的網站網址,但裡面藏著惡意程式碼。
怎麼藏的呢?
你可能看過這種網址:https://example.com/search?q=手機
問號後面的 q=手機 是搜尋的關鍵字。
當你點擊這個連結,網站會顯示「您搜尋的關鍵字是:手機」。
駭客的手法是:把「手機」換成一段惡意程式碼。
當你點擊這個連結時,會發生什麼事?
首先,瀏覽器會向網站的伺服器發送請求,請求裡包含完整的網址。
伺服器收到請求後,會從網址裡取出 q= 後面的內容(也就是搜尋關鍵字)。
接著,伺服器會產生一個網頁,把這個關鍵字放進 HTML 裡面,變成「您搜尋的關鍵字是:OOO」。
最後,伺服器把這個網頁傳回給瀏覽器。
問題就出在這裡。
如果伺服器沒有檢查 q= 後面的內容是什麼,就直接放進 HTML 裡,那麼惡意程式碼也會被放進去。
所以惡意程式碼就從「網址」跑到「網頁」上了。
瀏覽器收到這個網頁後,看到裡面有程式碼,就會自動執行。
瀏覽器不知道這段程式碼是從網址帶進來的,它只知道「網頁裡有程式碼,我要執行它」。
因為程式碼是從「網址」帶進來,再被「反射」到網頁上的,所以叫做「反射型」XSS。
這兩種方式的差別在於: