在網路的應用服務中,應用最廣的除了E-mail服務之外,就屬Web服務的應用了。對於企業而言,網站往往代表企業的形象。一旦企業網站發生安全上的漏洞,除了有形的損失外,對於無形的商譽損失更是難以估計,也因此網站安全也愈顯重要。
所謂的網站安全問題,除了系統本身的漏洞外,更常見的是網頁程式本身撰寫的漏洞,駭客經由程式的漏洞入侵資料庫的事件時有所聞。
要保證網頁程式安全的最佳方式,還是以舉行程式碼檢視(Code Review)會議最佳,由各個程式設計師一同檢視相關程式以找出漏洞,但此方法耗時費力,所以通常會利用網頁弱點掃描程式進行掃描,希望藉此發現程式本身潛在的漏洞。
針對以上的情形,本文除了說明撰寫網頁程式所需注重的OWASP Top 10(2013年版)規範外,並將介紹開源碼社群中頗富盛名的w3af軟體來為網頁程式進行健檢。
淺論OWASP Top 10(2013年版)
OWASP(全名是Open Web Application Security Project,官方網站為http://www.owasp.org)是一個專門研究網頁安全的團體,長期致力於網頁安全相關問題的研究,依照往例,該組織每三年均會出具一份研究報告,俗稱OWASP Top 10,針對最具有威脅性的網頁安全問題進行說明,所以此份報告通常為程式設計師所需遵守的準則,如圖1所示。
|
▲圖1 OWASP Top 10之2010年與2013年版。 |
接著,簡單說明OWASP 2013 TOP 10各個安全漏洞(嚴重性由高至低排序):
A1:Injection(注入攻擊)
此種漏洞型態的成因,不在於系統(不管是作業系統或是網站伺服器系統)本身,而是肇因於程式設計師出於疏失或經驗不足的原因,在撰寫程式時,並未對使用者輸入的參數值進行適當的驗證或過濾(包含驗證輸入欄位資料型態及驗證輸入欄位內容),以致於惡意使用者可利用惡意的輸入值(如惡意SQL指令串或惡意的Script碼),即可能讓程式自動執行惡意的指令而對系統造成危害。由於對系統而言,即使惡意的使用者在輸入欄位中輸入惡意的字元,依然是屬於正常的通訊交換,所以一般的資安設備無法偵測出此類攻擊行為。
Broken Authentication and Session Management(鑑別與連線管理漏洞)
此漏洞主要是指網站自行開發的身分證驗證與連線(Session)管理機制具有安全性的缺失,最常見的情況為網站未適當地控管網站認證身分所使用的Session並未設定適當的自動離線(Timeout)的時間,以致於當前一個具有授權身分的使用者登入後,如果在離開時忘了做登出的動作,網站將會一直停留在登入的狀態中,後續的使用者即可以前一個登入的使用者身分繼續使用系統。另外,網站認證身分所使用的Cookies檔案(這是一種存放在使用者端電腦的小檔案,裡面存放一些讓伺服器讀取的資料),如果未加以適當的加密。那麼有心人只要存取此檔案並加以解讀,即可取得相關敏感的資訊。
Cross Site Scripting(XSS,跨網站腳本攻擊)
跨網站腳本攻擊發生的原因就如同SQL injection一樣,同樣是因為程式沒有檢驗使用者輸入的參數內容(惡意攻擊者可輸入惡意的Script碼)所造成。不過,與SQL injection最大的不同,在於SQL injection會對於資料庫所在的主機造成重大危害(例如取得資料庫內的重要資訊或損壞資料庫,甚至造成系統無法正常的運作),但XSS攻擊主要是造成瀏覽該網站使用者安全上的危害(通常是瀏覽者的認證Cookies資訊外洩,或是不知情的使用者下載了惡意程式或被轉址到其他的網站),往往不會對於網站主機造成危害,也因此常被網站管理者所忽略,而使得此種攻擊有越來越普遍且不容易被發現的趨勢。
Insecure Direct Object References(不安全的物件參考)
此漏洞也是肇因於未對使用者輸入的參數值(此參數值為外部的物件,例如檔案)進行驗證所造成的安全漏洞。在實務上,常被要求寫一種只要使用者輸入相關參數(如文字檔名或圖檔等相關物件)即自動的顯示或執行。以下為一常見的例子:如果今天程式設計師被要求撰寫一個使用者只要輸入檔名即能動態顯示使用者所輸入之檔案內容的程式,那麼最直覺的想法便是直接將要顯示的檔名(需包含路徑資訊)當成參數傳進去就好,程式直接根據此參數進行開檔與顯示的動作即可。
如連結「http://xxx.xxx.xxx.xxx/show.php?file=xxx.txt」所示,程式在接到輸入參數值後,再根據傳進的輸入參數值,直接開檔顯示內容即可,但是如果程式未對輸入的輸入參數進行任何的驗證(例如驗證該檔案只限於某個目錄才可顯示該檔案內容),就有可能出現惡意的使用者利用傳入「../etc/passwd」類似的字串,其中..為回到上一層,此輸入參數的意思指向「/etc/」目錄下的passwd檔案。倘若程式未對輸入參數進行控管與驗證,當輸入此類的檔名時,就可能將該檔案的內容顯示出來(以本例而言即為「/etc/passwd」),此即為不安全的物件參考的安全漏洞。