跨網站偽造請求(CSRF)攻擊是透過偽造網站合法使用者身分的方式來進行非法存取動作,在世界各地已造成諸多資安外洩事件。這裡將介紹一套可部署在Apache網站伺服器上用來防護CSRF攻擊的軟體mod_csrfprotector,替網站伺服器增添防護功能,給重要資料多一份保障。
若提到網站資安漏洞,大部分的人第一個印象大概都是SQL injection(資料庫隱碼攻擊)或XSS(Cross-site Scripting,跨網站指令碼),而對於CSRF(Cross Site Request Forgery,跨網站偽造請求)攻擊就相對陌生一點,事實上,此類攻擊的嚴重性並不亞於SQL injection或XSS,也常是著名OWASP Top 10文件中的常客。
跨網站偽造請求(CSRF)主要就是利用當受害者合法取得網站使用認證(例如登入網站)後,透過某些方式偽造網站合法使用者的身分進行非法的存取動作,合法使用者即可能在不自覺的情況下執行攻擊者的指令。因此,在本文中將介紹一套用來防護CSRF攻擊的軟體,名稱為mod_csrfprotector,它可部署在Apache網站伺服器上,為Apache加上防護CSRF攻擊的功能。
了解HTTP通訊協定
在說明CSRF攻擊之前,先簡單說明HTTP通訊協定的實際存取過程,如圖1所示,在此將先定義以下兩個動詞:
‧要求(Request):為使用者以瀏覽器向網站伺服器要求服務的動作。在本文中如果提到Request,即表示使用者向瀏覽器要求服務的動作,如果是Request封包,則表示使用者利用Request所送出的Request內容。
‧回覆(Response):網站伺服器在接收到使用者所發出的Request並完成服務後,將結果回覆給使用者的動作。同樣地,在本文中如果提到Response,即表示網站伺服器回覆使用者的動作,如果是Response封包,就表示網站伺服器利用Response所回覆的Response內容。
|
▲圖1 HTTP通訊協定存取過程。 |
相關的存取過程分成兩步驟,內容簡述如下:
第一步驟是,使用者端利用Request要求網站伺服器進行服務,Request封包內容將分成兩個部分,一個是要求標頭(Request Header)的部分,而另一個是要求內容(Request Body)的部分。要求標頭主要是用來傳送要告知網路伺服器的特殊資料,例如所使用的瀏覽器名稱、傳送時間等等相關資訊。其格式為「欄位名稱:欄位值」,例如最常見的User-Agent,表示使用者所使用的瀏覽器相關資訊。
在此不多談其他欄位的意義,有興趣的讀者可由編號2616的RFC(Request For Comments)文件中得知關於HTTP通訊協定更多的資訊。而要求內容,即是使用者端要傳送給網站伺服器的資料內容,例如使用者在網站上所填寫的表單(Form)資訊。
第二步驟是,網站伺服器在接收到使用者端的Request封包後就會進行處理,並且在處理完成後將處理結果Response給使用者端。同樣地,Response封包內容也會分成兩個部分,一個是回覆標頭(Response Header)的部分,而另一個即是回覆內容(Response Body)。
就如同Request訊息,回覆標頭主要回覆特殊的資訊(例如網站伺服器的名稱、回覆的時間等等相關資訊)告知使用者,而回覆內容則是實際回傳給使用者的資訊內容(通常為網頁的內容)。
如上所述為一般瀏覽網站伺服器上網頁的行為,可利用Fidder進行觀察。Fidder是一種Proxy軟體,可實際的觀測往來的HTTP封包內容,其官方網站為「http://www.telerik.com/fiddler」。
如圖2所示,即為使用Fidder所觀察到的HTTP封包內容,其中上半部為使用者所發出的Request下半部則為網站伺服器的Response。
|
▲圖2 使用Fidder觀察到HTTP封包內容。 |
只要對HTTP通訊協定稍有了解,都會知道HTTP是一種無狀態協議(Stateless Protocol)的通訊協定。這是一種不會記憶的的通訊協定,亦即使用者每次所發出的Request,對網站伺服器而言個別都是獨立的,也就是說,網站伺服器沒有辦法辨別某些Request是相關的。
這在現實的運用上會發生很大的問題,例如以網路購物為例,如果使用者A對購物網站發出第一個Request買了第一本書,接著他又要再買一支筆,於是又發出第二個Request要買筆,此時網站伺服器需要有個機制來辨認出這兩個Request是相關的,並且都是由使用者A所發出來的。為了解決此類問題,而發展出Cookies和會話(Session)的機制。
簡述Cookies與Session
大部分的人都有這樣的經驗,當造訪過某個網站,隔一段時間後,再來造訪同樣的網站,會發現這個網站似乎有記憶功能一樣,還記得上次所操作過的動作。例如,曾經至某個財經網站查詢個股的資訊,當下次再造訪同樣的網站時,網站會顯示上次所查詢的個股資訊。這其實並不是網站有記憶功能,而是利用Cookies功能。反觀,如上所述,HTTP是一個沒有記憶功能的通訊協定,它並無法標記Request來從事一些特殊應用。