網頁應用程要設計的安全很不容易,因為網頁的原始碼會傳送到瀏覽器端,駭客可以從容地分析網頁原始碼、Request 及 Response 的標頭,可以嘗試各種不同的攻擊 payload! 有些弱點雖然專家一再提醒,但許多網頁(網站)卻一再出現,甚至許多程式設計師故意忽略這樣的弱點、或者不知如何修正這些弱點
底下是我幾年來參與黑白箱掃描及滲透測試的心得,是程式設計常疏忽的地方:
- 圖方便,用變數串接方式產製查詢字串或動態命令!
使用變數串接可以簡化程式碼撰寫,所以程式設計師理所當然優先選擇這種撰寫方式,尤其涉及較多變數(參數)時,使用變數串接可節省更多程式碼,相對也省下許多時間。程式設計師圖一時方便,因此造就了 Injection 漏洞,當被發現系統存在這種漏洞時,有些程式設計師不思正統的寫法,反而自己撰寫過濾程式(見8.),當然不是自己寫作的機制就不好,只是沒有經過有效驗證,或許不如自己想像那麼強固! - 以為使用者會乖乖輸入規定的資料格式
許多新手設計師以為使用者會照著設計規格書上說明的輸入資料,甚至自己測試時,也只會輸入「合法」的資料來驗證功能,完全不在意「違規」的資料格式,不會適當處理違規的資料,因此提供駭客一道可敲測的通道! (駭客就是不按牌理出牌) - 以為 javascript 可以實現資料驗證或管理授權
這是我遇過最多的漏失(還有 4.),甚至有設計師跟我爭論他的系統已盡到相當完善的防護,還當場測試以驗證他的論點, 可惜他並不知曉許多瀏覽器的外掛(Plugins)都可以協助繞過javascript檢核,甚至駭客進行滲透是不用常規瀏覽器的! javascript 驗證或授權就像紙上畫的鎖,一般使用者會以為有鎖,但小偷卻毫不費力就可以突破。 - 以為使用者看不到隱藏欄位內容
如同 3. 一樣,這種漏失也很常出現,其實只要「查看網頁源始碼」就可以看見隱藏欄位的內容,完全不需要特殊技巧, 所以不該利用隱藏欄位傳遞機敏資料。 - 不明白或故意忽略Cookie 防護的重要性
很多設計師會利用Coolie 來儲存資料,以便在不同網頁間交換資料,卻不明白Cookie 的運作原理,其實Cookie 是以純文字模式儲存在 Client 端,有很多工具可以修改Cookie的內容,因此 Cookie 不是安全的儲存體,不該用 Cookie 來存放如帳號、密碼或角色等資訊,以免被篡改而不自知。 - 使用 WebService ,卻忘了每次叫用時都需求再認證
初學用WebService的設計師會以為 WebService 不會獨自運作,一定是透過他的程式才會被呼叫(把WebService 跟一般的程式庫或物件API搞混了),其實只要 WebService 沒有適當防護,「任何人」都可以命令它工作,所以採用 WebService 機制比一般 Web AP 更需要費心在網頁安全上。所以在每一個WebService 方法的進入點都要執行身份驗證及授權。 - 以為限制網頁欄位的輸入長度,可以防止複雜的注入攻擊指令
如同 4. 一樣,屬於自以為...的心態,同樣的,瀏覽器的外掛或 Local Proxy 都可以繞過這層限制,而無限制的輸入(傳送)超長資料。 - 自認自己寫成的特殊符號過濾程式就可以達成防注入的功能
是的,許多自負的設計師會自己開發濄濾程式,避掉特殊符號,以為這樣就可以防止注入攻擊,的確,過濾掉特殊符號可以防止9成以上的注入攻擊,可是剩下的1成才是駭客最常用的攻擊方式,如果可以,建議還是採取正統的撰寫模式。
上面提的這些只是常見的,幾乎用手動測試就可以發現的漏洞,算是最基本網頁安全的課題,希望可以給程式設計師資安防護的基本參考,同時提供初入網頁滲透測試者基本的偵查方向。
沒有留言:
張貼留言