我們先前介紹了緩衝區溢位攻擊或是資料隱碼攻擊,這兩種攻擊有個共通的特質,就是它們都是透過系統所接收來自於使用者端的輸入資料來發動攻擊。透過精心設計、又別有用心的輸入資料,使得系統產生了預期之外的行為,進而達到安全性攻擊的效果。

事實上,這驗證了在撰寫具安全性的程式碼的基本原則──「來自使用者的資料很邪惡」。無論是緩衝區溢位攻擊或是資料隱碼攻擊,都是因為「邪惡」的使用者資料,才使系統產生了安全性危機。倘若邪惡的資料被系統所過濾、防備,那麼便不致於被攻擊者長驅直入。因此,「無論如何都不相信來自使用者的資料」,就成了撰寫具安全性程式碼的重要守則。

除了這兩種攻擊手法之外,還有另一個同樣惡名昭彰的攻擊方式,同樣也是利用系統對於使用者所輸入的資料內容防範不周,而所刻意設計出可以達成穿越系統安全防線的資料,此種攻擊就是所謂的「跨站指令碼(Cross-site Scripting)攻擊」,簡稱XSS攻擊。

徹底解析跨站指令碼攻擊的運作原理,以及發動方式
從「跨站指令碼攻擊」字面上來看,或許不那麼容易明白這種攻擊模式的精神所在。如果我們把它稱為「網頁程式碼注入(HTML Injection)」攻擊,應該可以讓你更輕易地了解究竟攻擊是如何進行的。

就像之前介紹的資料隱碼攻擊(SQL Injection)的攻擊方式,是在系統接收來自使用者的輸入資料時,別有用心的使用者不輸入單純的資料,而是摻入了SQL述句的內容,而所摻入的內容會被系統運用並於資料庫伺服器上執行,因而運作出攻擊者想要的結果。

同樣地,網頁程式碼注入攻擊,也是在系統接收來自使用者的輸入資料時,使用者刻意摻入了HTML碼,而所摻入的內容一樣會被系統運用,只不過是於使用者瀏覽器上呈現罷了。

舉例來說,論壇網站系統都能夠讓使用者進行張貼文章的動作。當使用者輸入文章或回應的內容時,系統便會將內容儲存起來,待其他使用者檢視文章內容時,再將該使用者所輸入的內容附加在輸出的HTML之中。

一般來說,使用者大多會輸入一般的純文字內容,但倘若使用者輸入的是HTML,甚至裡頭還摻雜著JavaScript這種可以在瀏覽器上執行的程式碼時,那麼,當其他使用者檢視該內容時,便會讓所摻雜的HTML碼,改變系統原本正常的顯示方式,甚至執行了其中的JavaScript程式。這麼一來,輕者被這些HTML碼改變原先正常的顯示方式,造成了其他使用者瀏覽、閱讀上的困難,重者在每個瀏覽這段內容的使用者的瀏覽器上執行了JavaScript程式,程式的行為究竟是什麼很難說,但恐怕不會是善意的。

曾經看過一個政府機關的網站,因為留言版存在跨站指令碼攻擊的缺陷,使得留言內容被植入了惡作劇的HTML碼,造成了網站內容顯示的行為受到改變,使得瀏覽該網站的使用者,從外觀上看起來,好像該政府機關發布了一個不可思議的消息一樣。對於不明究理的人來說,顯然也能達到影響視聽的效果。若只是被植入和視覺有關的HTML碼也就算了,大多數影響深遠的跨站指令碼攻擊,其嚴重處都是因為植入JavaScript程式碼。

XSS攻擊也能結合網路蠕蟲形式,造成大量散播
在安全性的攻擊中,最能造成威脅的,當然是足以在攻擊對象的電腦上執行攻擊者所指定程式碼的那一種。

仔細回想,緩衝區溢位攻擊,是利用緩衝區溢位的手法,來植入程式碼並加以執行;資料隱碼攻擊,則是將欲執行的SQL述句包藏在資料中,透過伺服器執行資料庫操作資料的時候,趁機執行這些SQL述句。基本上,SQL述句可以視為是某種形式的程式碼。而跨站指令碼攻擊,當然也是屬於植入自訂程式碼並且加以執行的攻擊模式。

緩衝區溢位攻擊一次攻擊一部電腦,除非寫成蠕蟲的型態,否則擴散速度還不會太快。而資料隱碼攻擊一次針對一部主機,但因為主機同時服務眾多的使用者,所以影響範圍就很廣了。至於跨站指令碼攻擊,一旦有惡意企圖的程式碼被植入到網站之後,所有瀏覽該網站內容的使用者,都可能受到這種型態的攻擊,因此,後續擴散的速度和範圍也是相當大。

舉例來說,知名的微網誌網站twitter,便曾遭受到人稱「StalkDaily蠕蟲」的跨站指令碼攻擊。StalkDaily蠕蟲是如何攻擊呢?

它利用了twitter的XSS漏洞,感染使用者個人資料的欄位,進而植入JavaScript程式碼。其他的使用者,只要檢視了受感者的個人資料頁面,就會自動執行這段JavaScript程式碼。而這段JavaScript的程式碼會做些什麼事呢?

它會接著感染檢視者的個人資料欄位,同時以被感染者的帳號再發出和www.stalkdaily.com網站相關的訊息。所以,透過這種交互感染的方式,只要想辦法建幾個帳號,再發出一些看似有趣、吸引人的訊息,讓其他使用者瀏覽到這些帳號的個人資料頁,便能夠讓其他使用者執行到所植入的JavaScript程式碼,也就讓這些使用者受到感染。於是,一傳十、十傳百,就會有數量龐大的使用者都因此而受到了感染。

從twitter受到跨站指令碼攻擊的往事說來,便不難明白跨站指令碼攻擊的可怕之處。因為,植入的程式碼是在網站使用者的電腦上執行的,所以,這樣的程式碼等於是用該使用者的身份來執行的。因此,程式碼可以取得許多和該使用者相關的資訊,也能偽裝成該使用者從事各種行為。

若攻擊目的是取得或偽冒使用者身分,後果將不堪設想
所以,許多發動跨站指令碼攻擊的程式碼,都會試著取得使用者的帳號資訊或是cookie,一旦捕獲系統管理員的帳號,那就算是撈到大魚了。除此之外,還可以盜取使用者或是系統的各種資料,若是銀行系統設計不佳,利用植入的JavaScript,將使用者的帳戶款項偷偷移轉到其他的帳戶,都有可能發生。既然都可以在別人的電腦上執行程式了,那自然是充滿各種的可能。

發動跨站指令碼攻擊的攻擊者,也可以透過植入的程式碼,指揮受感染者的電腦對其他的網站進行分散式的阻斷式攻擊。

然而,這種攻擊的來源IP位址十分廣泛又分散,而且同時發動攻擊的電腦數眾多,對於遭受到攻擊的網站,可說是極難抵擋。

由於跨站指令碼攻擊對Web應用足以造成極大的安全性威脅,而許多Web應用程式的開發者對於XSS的防範準備卻又不夠充份,警覺心也不夠,使得跨站指令碼攻擊,成了Web應用程式在安全性上的厲害殺手。接下來,我們會針對這種攻擊方式的進一步細節,以及究竟該如何防範,提出一些建議。

作者簡介


Advertisement

更多 iThome相關內容