在 Web 應用程序中有效管理用戶狀態需要在性能、可擴展性、可維護性和安全性之間取得精妙的平衡 。在管理客戶端上儲存的用戶狀態時,安全考慮就顯得額外重要。我的一個同事曾經說過,處理客戶端的 狀態數據就像把蛋筒冰激淋交給一個 5 歲的孩子:您可以把冰激淋拿回來,但是您絕對不能期望拿回來 的時候冰激淋的形狀還像給出去的時候一樣!
在這個月的專欄中,我們會圍繞 ASP.NET 應用程序中的客戶端狀態管理來探討一些安全隱患,特別會 關注視圖狀態安全。(請注意:本文假設您熟悉有關 ASP.NET 視圖狀態的概念。)。
如果您認為應用程序的視圖狀態中存儲的任何數據都不值得保護,請再仔細考慮一下。敏感信息甚至 會在您尚未察覺的時候進入視圖狀態中。即使您非常警惕,采取了防止敏感信息通過視圖狀態丟失的措施 ,攻擊者仍然能夠篡改視圖狀態,甚至會給您和您的用戶帶來更大的麻煩。幸運的是,ASP.NET 帶有一些 內置的防御組件,用於防御這些攻擊。讓我們看看如何正確使用這些防御組件。
威脅 1:信息洩露
在 Microsoft,開發團隊使用 STRIDE 模式對威脅進行分類。STRIDE 是首字母縮寫,分別代表:
假冒
篡改
否認
信息洩露
拒絕服務
提升權限
視圖狀態安全所涉及到的兩個主要 STRIDE 類別是信息洩露和篡改(成功的篡改攻擊可能會導致提升 權限,我們會在後面詳細進行討論)。信息洩露是這些威脅中比較容易說明的,因此我們就先從它開始討 論。
有關視圖狀態的一個最令人遺憾、最常見的誤解就是,它經過了加密或其他方式處理,無法被用戶讀 取。畢竟,視圖狀態字符串看起來肯定不是可分解的:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjkPFgIeCHBhc3N3b3JkBQlzd29yZGZpc2hkZA==" />
然而,這個字符串只是 base64 編碼的,沒有采用任何強大的密碼算法。我們能夠通過受限對象序列 化 (LOS) 格式化程序類 System.Web.UI.LosFormatter 輕松對該字符串進行解碼和反序列化:
LosFormatter formatter = new LosFormatter();
object viewstateObj = formatter.Deserialize ("/wEPDwULLTE2MTY2ODcyMjkPFgIeCHBhc3N3b3JkBQlzd29yZGZpc2hkZA==");
快速看一下調試器(請參見圖 1),就能發現反序列化的視圖狀態對象實際上是一系列 System.Web.UI.Pair 對象,以包含值“password”和相應字符串值“swordfish”的 System.Web.UI.IndexedString 對象結尾。
圖 1 調試器揭示的秘密視圖狀態數據
如果您不打算自己去費勁編寫代碼來反序列化視圖狀態對象,Internet 上有幾種很好用的視圖狀態解 碼器可供免費下載,包括 Fritz Onion 的 ViewState Decoder 工具,網址為: alt.pluralsight.com/tools.aspx。