天天看點

安全:Web 安全學習筆記

背景

說來慚愧,6 年的 web 程式設計生涯,一直沒有真正系統的學習 web 安全知識(認證和授權除外),這個月看了一本《Web 安全設計之道》,書中的内容多是從微軟官方文檔翻譯而來,這本書的含金量不高,不過也不能說沒有收獲,本文簡單記錄一下我學習 Web 安全方面的筆記。

本文不涉及 IIS、Windows 和 SqlServer 的安全管理與配置,盡量隻談程式設計相關的安全問題。

最簡單的 Web 實體架構

安全:Web 安全學習筆記

浏覽器和伺服器的通信采用無狀态的 HTTP 協定。

通過控制 HTTP 的請求頭,可以控制:用戶端緩存、Cookie、請求編碼、相應編碼等。

請求内容向伺服器送出資料(POST 和 GET),響應内容向浏覽器發送資料。

Cookie 包含在每個請求和響應中,是以用戶端和伺服器都可以通路到。

一般使用 Cookie 來維護一個浏覽器會話(也有其他方式)。

攻擊方式總覽

安全:Web 安全學習筆記

Web 軟體安全攻擊防護

一、浏覽器安全攻擊

Cookie 假冒

安全:Web 安全學習筆記

定義

非期望的修改 Cookie 的值

場景

伺服器将使用者的授權資訊存儲在 Cookie 中,然後用戶端用這些 Cookie 決定導航的顯示與否。如果有程式惡意的修改了Cookie,會導緻權限提升

攻擊方式

注入的 Javascript 代碼

使用浏覽器調試工具

本機病毒等

防護措施

盡量将 Cookie 設定為 HttpOnly,浏覽器僞造不了這種 Cookie

防止 Javascript 注入

隐藏變量修改

安全:Web 安全學習筆記

非期望的修改隐藏變量

訂單的折扣計算完全依賴用戶端的某個變量,這個變量是從伺服器生成的,所有邏輯都在用戶端計算,伺服器隻是接受最後的計算結果。如果有程式惡意的修改了變量,會繞過某些業務邏輯

保護措施

關鍵的功能不要依靠用戶端控制,要采用伺服器控制

跨站腳本攻擊

安全:Web 安全學習筆記

惡意的送出 Javascript 代碼

在部落格的評論功能中,如果使用者惡意的送出 Javascript 代碼,假如這些 Javascript 沒有被過濾,極端的情況下,這些代碼會劫持所有通路此頁面使用者的會話,通路和修改任意資料。

在伺服器端驗證和過濾惡意輸入

開啟 ValidateRequest="true"

對輸出使用 this.Server.HtmlEncode

二、伺服器安全攻擊

緩沖區溢出

安全:Web 安全學習筆記

某些可能輸入會導緻伺服器堆棧溢出,這直接緻使伺服器不可用。

程式提供了某項計算密集型的功能,此功能沒有限制使用者輸入,使用者在有意或無意之間輸入了一個非法的值,導緻了緩沖區溢出。

非法輸入

采用防僞式程式設計

認證逃避

某些 URL 沒有出現在首頁導航界面,系統隻對導航頁面進行了認證和授權管理,這些沒有出現在導航中的 URL 可能被惡意使用者給分析出來,直接進行通路。

使用者管理分為三個頁面:List.aspx、New.aspx,程式隻對 List.aspx 進行認證和授權了,某些使用者直接通路 New.aspx 執行添加操作。

直接位址通路

梳理網站的整體結構,對所有頁面進行認證和授權管理

安全:Web 安全學習筆記

(舉例說明)

病從口入,禍從口出。很多攻擊方式都是因為非法輸入導緻的

程式隻在用戶端對輸入進行了驗證,伺服器未做任何驗證,惡意的程式可以繞過用戶端邏輯直接向伺服器送出非法輸入,這很容易導緻各種安全問題

授權逃避

某些 URL 沒有出現在首頁導航界面,系統隻對導航頁面進行了認證和授權管理,這些沒有出現在導航中的 URL 可能被惡意使用者給分析出來,直接進行通路。還有一種可能是:系統隻在用戶端進行了授權管理,伺服器代碼并沒有進行授權驗證,惡意使用者很容易就可以逃避授權

當使用者沒有 Create 權限的時候,系統隻是禁用了浏覽器按鈕,并沒有做伺服器授權,然後使用者使用浏覽器調試工具啟用了按鈕,就可以執行 Create 了

修改用戶端代碼

在伺服器進行授權管理

SQL 注入

安全:Web 安全學習筆記

對于和背景資料庫産生互動的網頁,如果沒有對使用者輸入資料的合法性進行全面的判斷,就會使應用程式存在安全隐患。使用者可以在可以送出正常資料的URL或者表單輸入框中送出一段精心構造的資料庫查詢代碼,使背景應用執行攻擊着的SQL代碼,攻擊者根據程式傳回的結果,獲得某些他想得知的敏感資料,如管理者密碼,保密商業資料等

伺服器程式使用字元串拼接的方式來構造 SQL 語句,這就會導緻 SQL 注入攻擊的可能

惡意的送出 SQL 片段

不要拼湊 SQL 參數,采用 DbParameter 設定參數

最小化 SQL Server 通路賬戶的權限

異常敏感資訊洩露

安全:Web 安全學習筆記

未處理異常直接顯示到浏覽器,這會導緻敏感資訊被洩露,對最終使用者來說,也會讓他們感覺系統不夠安全和易用

因為開發原因,在某些場景下浏覽器将後端的異常直接顯示給浏覽器了,如:NullReferenceException等

在調用的最上層,為處理掉全部異常

在調用的下層,為封裝合适的異常資訊

定義合理的異常處理政策

異常一定不能跨越邊界直接顯示到浏覽器

上傳攻擊

安全:Web 安全學習筆記

使用者惡意的上傳外挂、木馬和其它程式等

你做了一個上傳功能,結果對上傳的檔案沒有做好足夠的控制,比如:某些惡意的使用者會上傳一些惡意的腳本,然後執行這些腳本

上傳惡意檔案

在伺服器端驗證和過濾惡意輸入,如:字尾名限制

對上傳後的檔案進行掃描和殺毒

抵賴

安全:Web 安全學習筆記

某些使用者由于某些原因,不願意承認自己執行過某些操作,當然,某些操作可能是他們沒有意識的情況下執行的

使用者一不小心執行的删除操作,然後立即發現自己操作錯誤了,然後他打電話給售後,說系統有問題

界面引導不夠友好,容易導緻誤操作,為了推卸責任,進行抵賴

使用者惡意的執行操作,然後抵賴

提高界面的易用性

關鍵操作的提醒要足夠明顯

所有操作要留下記錄檔

三、資料庫安全攻擊

連接配接字元串暴露

資料庫連接配接字元串中包含使用者名和密碼,這些資訊以明文的形式存儲在配置檔案中,運維和開發人員都能看得到,随着團隊人員的流動,這些敏感資訊也會暴露

直接将連接配接字元串配置在 Web.Config 中,而這個檔案沒有被加密

未加密連接配接字元串

未加密配置檔案

加密連接配接字元串

加密配置檔案

存儲資料洩露和篡改

某些敏感資訊最終需要被存儲在資料庫中,如果這些資訊被存儲為明文,會有很多人員可以看到這些資訊,極端情況下,某些黑客攻陷了伺服器,也可以看到這些資料

為加密密碼、關鍵财務資訊,稅務局來查賬了

未加密敏感資料

加密方法過于簡單

加密敏感資料

對某些資料采用不可逆加密,如:密碼

對某些資料采用可逆加密,如:财務資料

四、網絡安全攻擊

拒絕服務攻擊

惡意使用者試圖攻擊伺服器、網絡和系統,最終的目的是讓系統不可用,停止對外服務

惡意使用者在嘗試并發的無限制的向伺服器發送請求,試圖讓伺服器的負載達到最大,最終讓系統停止對外服務

攻擊網絡

攻擊伺服器

攻擊系統

在程式級别,識别并攔截惡意的請求

購買第三方安全軟體

傳輸數組洩露、篡改

惡意的代理伺服器或路由器攔截使用者的請求,讀取或修改敏感資料

您在咖啡館發現了一個免費的 WIFI,然後偷偷的接入了,您還暗自高興,當您使用這個免費的 WIFI 進行網上沖浪的時候,您的各種資訊都會被 WIFI 給攔截,如果是惡意的使用者,結果可想而知

綁架路由器

免費 WIFI 騙局

為加密的傳輸協定

未加密的傳輸資料

加強用戶端路由的安全管理

慎重的選擇代理伺服器

使用安全的傳輸協定,如:SSL

備注

這篇算是安全方面的 Hello,World了,今後好好好學習一下安全方面的知識,目前找到了兩個好的資源,如:

Security in the .NET Framework

.NET Security Overview

安全:Web 安全學習筆記