SQL injection 資料庫隱碼攻擊 資訊安全 XSS

安裝mod_csrfprotector 抵禦CSRF攻擊

2018-06-26
跨網站偽造請求(CSRF)攻擊是透過偽造網站合法使用者身分的方式來進行非法存取動作,在世界各地已造成諸多資安外洩事件。這裡將介紹一套可部署在Apache網站伺服器上用來防護CSRF攻擊的軟體mod_csrfprotector,替網站伺服器增添防護功能,給重要資料多一份保障。

伺服器端

可由CSRF(Cross Site Request Forgery)的命名中,發現跨網域(Cross Site)為此類攻擊的最主要特點。什麼是跨網域?在使用網站系統時,通常都會是在同一個網站中移動使用。

以上述的登入流程為例,例如網域為「http://example.com」,而登入程式為login.php,且登入成功後的管理介面程式為manager.php。管理者即會由「http://example.com/login.php」登入,在成功登入後,便會跳轉到「http://example.com/manager.php」,此即為同一個網域。

但實施CSRF攻擊的攻擊者,其所發出Request封包的來源網域,通常會是其所在的網域,而不會是example.com,此即為跨網域。因此,便可善用此特徵來阻擋疑似CSRF攻擊的Request。

在HTTP通訊協定中,Request Header內定義了Referer欄位,此欄位會儲存上一個瀏覽過的網頁位址。例如,在manager.php網頁所接收到的Request封包中的Referer欄位內容即為login.php。因此,可以利用在網頁程式中加上檢查此Referer欄位的機制,如果Referer的內容不是位於同樣的網域即加以阻擋,如此就能夠有效地阻擋來自其他的網域的Request,進而降低CSRF攻擊的威脅。

但是,此種的阻擋方式可能會阻擋到正常的Request,因為不是Request Header就一定要包含Referer欄位。很多的瀏覽器所發出的Request並不會包含Referer欄位,因此這種預防方式還是會有侷限性。

另外一種是實務上並不太可行但可完美解決CSRF攻擊的方法,亦即加上圖形驗證碼(Captcha),在每個要執行動作之前,都要求使用者必須先手動輸入正確的驗證碼,才能夠繼續執行。由於攻擊者不可能知道驗證碼的資訊,因此也無法進行攻擊。只不過使用此種方式,會對使用者造成相當大的困擾,所以大概只有高敏感性的作業會使用此種方式,例如網路銀行轉帳等等。

上述的方法是由跨網域的角度去思考,也可從另一個角度去思考,如果能在每個Request的內容(Body)中,加上一串只有發起Request之來源端及網站伺服器端知道的通行碼(稱為CSRF Token)。當網站伺服器取得Request封包後,比對Request Body的CSRF Token值是否與伺服器端的Token值一致,即可確認Request的真實性。同樣地,由於攻擊者並不會知道CSRF Token值,因此也就增加了CSRF攻擊的困難。

安裝mod_csrfprotector

在此以Apache 2.4.23為例,說明如何安裝mod_csrfprotector模組,可根據下列的指令來安裝(其中#為註解):

#取得mod_csrfprotector的最新原始碼
git clone https://github.com/mebjas/mod_
csrfprotector.git
#編譯成CSRF模組
apxs  -cia -n csrf_protector ./src/mod_
csrfprotector.c ./src/sqlite/sqlite3.c 
-lssl  -lcrypto

編譯完成後,就會在「/modules/」目錄下產生mod_csrfprotector.so模組檔案。此時可在httpd.conf中加入「LoadModule csrf_protector_module modules/mod_csrfprotector.so」來載入mod_csrfprotector模組,並利用一個簡單的PHP程式(假設網站伺服器有支援PHP)進行確認:


如果輸出內容有圖5般的資訊,就表示已成功載入mod_csrfprotector模組。


▲圖5 已成功載入mod_csrfprotector模組。

mod_csrfprotector模組組態介紹

mod_csrfprotector模組提供如下的組態選項,分別加以說明:

‧csrfpEnable:設定是否啟動csrf模組功能,提供兩個選項,On表示開啟csrf模組功能,Off則是關閉csrf模組功能。

‧csrfpAction:當mod_csrfprotector模組發現有類似csrf攻擊時,所要採用的動作包含:forbidden動作(若發現有類似csrf攻擊時,便禁止來源端連線)、redirect動作(如果發現有類似csrf攻擊時,就將來源端重新導向到其他地方)、message動作(如果發現有類似csrf攻擊時,便記錄所設定的字串)。

‧errorRedirectionUri:假如發現有類似csrf攻擊,並且csrfpAction設定為redirect,即重新導向到此組態所設定的位置。

‧errorCustomMessage:如果發現有類似csrf攻擊,並且csrfpAction設定為message的情況,就記錄此組態所設定的字串。

‧jsFilePath:設定防護csrf攻擊的JavaScript檔案所在。

‧tokenLength:設定CSRF Token的長度。

‧tokenName:設定CSRF Token的名稱。

‧disablesJsMessage:由於mod_csrf模組需要利用JavaScript功能,因此若發現使用者端關閉JavaScript功能,即可利用此組態所設定的字串資訊來提醒使用者。

‧verifyGetFor:設定要進行CSRF保護的URL資訊,此組態可利用正規表示法來進行設定,例如設定「verifyGetFor *://*/*」,就表示保護所有的URL資訊。

為Apache加上CSRF防護

在簡單說明相關組態後,接下來就可以在httpd.conf內加入下列的組態,為Apache網站伺服器添加CSRF防護功能:

LoadModule csrf_protector_module modules/
mod_csrfprotector.so

  csrfpEnable on
  csrfpAction forbidden
  errorCustomMessage "Access forbidden"
  jsFilePath "https://raw.githubusercontent.com
  /mebjas/mod_csrfprotector/master/js/
  csrfprotector.js" 
  tokenLength 20
  disablesJsMessage "please enable javascript "
  verifyGetFor *://*/*

最後,重新啟動Apache伺服器,即可為網站伺服器加上CSRF防護功能。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!