一、ASP.NET Web應用程序架構安全隱患
1. 對於程序集主要威脅:未驗證的訪問、反向工程、代碼注入、通過異常獲得程序信息、未審核訪問。
2. 客戶端與Web應用程序之間的安全隱患:代碼注入(跨站點腳本或緩沖區溢出攻擊)、網絡監控(密碼和敏感應用程序數據探測)、參數破解(表單字段、查詢字符串、Cookie、視圖狀態、HTTP頭信息)、會話狀態變量ID取得、信息獲取(通常使用異常)。
3. Web應用程序客戶端與企業服務之間的安全隱患:非審核訪問、破解配置數據、網絡監視、未約束代理、數據復制。
4. Web服務客戶端及其服務之間的安全隱患:非審核訪問、參數破解、配置數據取得、網絡監、消息回復。
5. Remoting客戶端及服務器之間的安全隱患:非審核訪問、參數破解、序列化、網絡監控。
6. 客戶端到數據之間的安全隱患:非審核訪問、SQL注入、破解數據模型和鏈接詳細信息、網絡監控、破解配置數據、破解面干應用程序數據。
* ASP.NET安全架構注意事項
1. 在浏覽器認證用戶;
2. 在浏覽器和防火牆通路中1)保護敏感數據2)阻止參數破解3)阻止會話攻擊和Cookie回復攻擊
3. 在Web應用程序側1)提供安全配置2)處理異常3)審核用戶4)驗證輸入
4. 應用程序服務器1)認證和審核上傳身份2)審核並記錄活動和事務
5. 在應用程序服務器和數據庫間保護敏感數據
6. 數據庫中加密或者哈希加密敏感數據
二、ASP.NET Web應用程序安全性隱患防治辦法
1. 防止跨站點腳本攻擊(Cross-Site Scripting Attack)
攻擊方法:在頁面通過輸入腳本或HTML內容獲取敏感數據。
威脅指數:6
攻擊結果:應用程序拒絕服務或重啟,獲得錯誤堆棧信息(※)推測代碼進行下一步攻擊。
※注:在ASP.NET配置文件中如果未關閉CustomErrors則可能導致在出現系統異常時顯示錯誤行代碼或數據庫連接字符串,洩漏配置數據,造成危險隱患。
預防措施:ASP.NET控件驗證或服務器端輸入驗證。
采用客戶端驗證和服務器端驗證結合的方式對用戶輸入進行驗證,通過比較控件輸入和其HTML譯碼值的一致性確認輸入字符串中是否含有HTML特殊符號,以此作為依據轉化HTML特殊符號,防止腳本在回發表示時觸發。
2. 防止SQL注入攻擊(SQL Injection Attack)
攻擊方法:通過畫面輸入或URL參數修改,利用其作為SQL查詢條件的特殊性,將輸入SQL文注入並返回結果的攻擊。
威脅指數:9
攻擊結果:可查詢敏感數據並可修改系統數據。
預防措施:在數據更新和查詢時使用數據庫參數對象或使用自定義方法轉換輸入參數,以使注入SQL文失效。
3. 驗證用戶輸入
通過客戶端驗證為主、服務器端驗證為輔(當禁用客戶端Javascript時服務器端驗證就尤為重要)
客戶端驗證主要負責驗證用戶輸入的類型、長度、關聯關系的驗證(此功能由系統擴展控件提供);
服務器端驗證分為兩部分:
1) 輸入驗證
輸入驗證需要對用戶輸入文字的HTML特殊字符進行驗證,含有特殊字符的要拋出系統錯誤;數據的長度控制盡量在畫面通過控件的允許輸入長度進行控制;
2) 數據驗證
驗證數據類型、長度等;此驗證行為在對象上進行。
4. 使用Hash算法保存密碼
使用ASP.NET Membership管理用戶,用戶密碼使用Hash算法和Salt加密,安全性高;
對於其它需要保存的密碼,系統基礎結構將提供Hash加密算法進行不可反向加密,作為驗證憑據,或者先取先用不保存在數據存儲中。
5. 數據安全性
1) 加密敏感數據:基礎結構應提供Hash加密算法支持數據加密。
2) XML數據安全性:防止XML數據攻擊。
攻擊方法:XPath注入和XXE(擴展XML實體)注入攻擊。
威脅指數:8
攻擊結果:獲得XML文件信息。
預防措施:不在XML中保存敏感信息,所有配置文件中的敏感信息需要加密保存,對於要寫入XML的數據應先通過驗證。
3) ViewState數據安全性:防止從ViewState獲取敏感數據。
攻擊方法:通過解碼ViewState獲得敏感信息。
威脅指數:6
攻擊結果:獲得ViewState中的敏感信息。
預防措施:禁用ViewState或避免,使用簡單控件采用加密方式保存敏感信息。
關聯問題:使用JSON字符串時注意敏感數據的處理。
6. 存儲安全信息到注冊表和配置文件
控制遠程用戶對配置文件的訪問權限,保護配置文件中的敏感數據。
7. 再發布前修正配置文件
為防止錯誤堆棧信息推測以及通過其它信息查獲手段進行攻擊,ASP.NET Web應用程序在發布前應對配置文件進行修正。
錯誤堆棧信息推測攻擊
攻擊方法:造成系統異常,通過錯誤頁上的堆棧信息推測代碼進行下一步攻擊。
威脅指數:6
攻擊結果:推測系統版本和代碼邏輯。
預防措施:捕獲系統異常使用統一頁面進行處理不表示錯誤堆棧信息,將自定義錯誤節點設置為<customErrors mode=”Off” />即可防止錯誤信息表示給遠程用戶;同時應關閉調試開關<compilation defaultLanguage=”vb” debug=”false” />防止通過調試信息洩漏源代碼或進行代碼注入。
同時應該關閉Trace優化性能並防止方法攻擊者利用Trace推測代碼執行過程和詳細內容:<trace enabled=”false” requestLimit=”10” pageOutput=”false” traceMode = ”SortByTime” />
對於Web服務要防止遠程用戶利用WSDL描述進行推測攻擊。
攻擊方法:訪問Web服務WSDL文件,獲得Web服務相關信息。
威脅指數:4
攻擊結果:獲得Web服務方法描述,推測Web服務參數,進行下一步攻擊。
預防措施:在配置文件中指定不表示Web方法描述內容,配置文件改修如下:
復制代碼 代碼如下:
<webServices>
<protocols>
<remove name="Documentation"/>
</protocols>
</webServices>
8. 使用Session但不使用Cookieless的Session
原因:Cookieless的Session將在URL中曝露SessionID,使別人易於利用進行攻擊。
9. 預防方向工程
攻擊方法:獲得程序集使用工具進行反向工程。
威脅指數:9
攻擊結果:了解程序邏輯,盜取開發成果。
預防措施:在發布時進行強加密和混淆工程。
參考:
ASP.NET Security: 8 Ways to Avoid Attack
http://www.devx.com/security/Article/20898/1954
《Hacking Exposed Web 2.0 : Web 2.0 Security Secrets and Solutions》,Rich Cannings, Himanshu Dwivedi, Zane Lackey,2008.