web應用程序的核心安全問題是:用戶輸入皆不可信。

爲防止惡意輸入,應用程序實施了大量的安全機制,而這些安全機制在概念上都具有相似性。

這些安全機制由以下幾個方面組成:

1、處理用戶訪問web應用程序的數據與功能(防止未授權訪問)
2、處理用戶對web應用程序功能輸入的數據(防止構造惡意數據)
3、應對攻擊(處理預料外的報錯、自動阻止明顯的攻擊、自動向管理員發送警報、維護程序的訪問日誌)
4、管理與維護應用程序

處理訪問

通常一個應用程序的用戶有不同類型如,普通用戶、登錄驗證用戶、管理員。對不同用戶web應用程序給予不同的權限,他們只能訪問不同的數據與功能。

web應用程序是通過三層互相關聯的安全機制來處理用戶的訪問:

1、身份驗證(Authentication)
2、會話管理(Session Management)
3、訪問控制(Access Control)

這三個機制處理用戶對應用程序的訪問,同時它也是三個受攻擊面(attack surface);而且這三者相互依賴缺一不可,無論哪個地方出了問題都會造成未授權訪問(木桶原理)。

身份驗證

身份驗證是處理用戶訪問的第一道機制,除非網站只有一種用戶,否則必須使用身份驗證。

如今web應用程序大都使用傳統身份驗證模型,即用戶名密碼。

在銀行等安全性較高的應用程序中會使用其他證書、雙因素認證等來強化這個模型;在安全性要求更高的應用程序中可能需要客戶端證書、智能卡或詢問-應答機制等其他身份驗證模型。

身份驗證機制往往還需要一系列其他支持功能,如註冊、忘記密碼、修改密碼等。

身份驗證機制存在一些普遍的漏洞,如遍歷用戶名、弱口令、邏輯缺陷避開登錄、社工庫查詢等等。

會話管理

通過驗證之後,就是管理用戶的會話了。爲了實施訪問控制,應用程序需要識別不同用戶提交的各種請求;爲此,應用程序需要爲每個用戶建立一個會話,並向用戶發送一個表示會話的令牌即session token。會話本身是保存在服務器上的一組數據結構,用於追蹤用戶和應用程序的交互狀態。

會話令牌一般在cookie中傳遞,有時也會出現在隱藏表單字段或者url查詢字符串上,會話令牌會在停止請求後一段時間內失效。

有些應用程序不使用會話令牌來識別會話,而是通過反覆提交用戶證書識別會話(http內置身份驗證機制就是這樣,通過反覆提交通過base64加密的賬號密碼來識別會話)。在一些情況下會話信息不保存在服務器上,而是保存在客戶端,爲了防止用戶修改,一般會對其進行加密。

會話管理的受攻擊面就是會話令牌本身,推測出會話令牌的生成規則或者截獲到其他用戶的會話令牌便可以以他人身份訪問未經授權的功能與數據。

訪問控制

如果前面的身份驗證與會話管理運行正常,應用程序便可以通過每個請求中的會話令牌確認每個用戶的身份與交互狀態,於是便可決定是否同意用戶的請求。

因爲典型訪問控制的要求比較複雜,每個角色有不同的權限,每個用戶只允許訪問應用程序中的一部分數據與功能,因此這個機制中一般存在大量漏洞,可以造成未授權訪問。

處理輸入

所有的用戶輸入都不可信,大部分對web應用程序的攻擊都與攻擊者專門構造的輸入有關,所以安全的處理用戶的輸入是保障應用程序安全的關鍵。

輸入的多樣性

web應用程序可能對一些特殊的輸入執行非常嚴格的檢查,例如長度限制、字符限制等;有時候則可能需要接受用戶提交的任意輸入;而隱藏表單字段和cookie等是在服務器上生成傳回客戶端,再由用戶的請求傳回服務器,在這個過程中攻擊者卻可以查看並修改它們。

輸入處理方法

不同的情況使用不同的處理方法,或者搭配使用。

1、黑名單

黑名單包含一組在攻擊中會使用的字符串或模式,所有與黑名單匹配的數據都會阻止。

黑名單是輸入確認效果最差的方法。原因有二:

1)用戶的輸入可以通過各種編碼或者其他的表現形式進行繞過,比如遺漏一些有相同作用的字符。例如alert(‘xss’)被阻止,還可以使用prompt(‘xss’)、例如web應用防火牆常受到空字節(null)攻擊,這是因爲在託管與非託管情況下處理字符串的方式不同。
2)術飛速的發展,使之產生一些新型的漏洞利用方法。

2、白名單

白名單包含一組良性的字符串、模式或一組標準。所有不與白名單匹配的數據都會被阻止。

白名單是輸入確認效果最好的方法,因爲指定白名單時只會留下安全的字符串,攻擊者無法構造輸入。

但是白名單具有侷限性。在許多情況下web應用程序必須接受一些不符合安全標準的字符,例如應用程序需要用戶以真實姓名註冊,但是姓名中卻包含一些連字符、撇號等可能對數據庫造成攻擊的字符。所以白名單具有侷限性,並非解決不安全輸入的萬能方法。

3、淨化

這種方式解決了白名單無法處理的部分,它接受一些無法保證安全的數據輸入,但是會對其進行淨化,例如刪除、轉義、編碼等

淨化可以作爲一種通用的方法,但是需要注意的是如果一個輸入項中需要容納幾種可能的惡意數據,就很能對其進行有效的進化。這時需要使用邊界確認。

4、安全數據處理

以不安全的方式處理用戶提交的數據,是許多web應用程序漏洞形成的根本原因。

安全的數據處理方式,不需要糾結於對用戶輸入數據的確認,轉而確保處理過程的絕對安全。例如防止sql注入的參數化查詢。

但是這項方法不適用於web應用程序需要執行的每一項任務,如果適用,它就是處理惡意輸入的通用處理方法了。

5、邏輯檢查

在一些漏洞中攻擊者與正常用戶的輸入完全相同,僅僅是動機不同,在這種情況下,以上機制幾乎完全無效。例如攻擊這通過修改隱藏表單字段提交的賬號,企圖訪問其他用戶賬號。此時再多的輸入確認也無法區別攻擊者與正常用戶的數據。爲防止未授權訪問,應用程序必須確認所提交賬號屬於之前提交該賬號的用戶。

邊界確認

鑑於核心安全問題的本質(所有用戶輸入皆不可信),可以將因特網(不可信)與服務器應用程序(可信)之間作爲邊界,然後在邊界淨化所有來自因特網的輸入,將淨化後的數據交給服務器應用程序。以上,是一種簡單的邊界確認,在分析實際的漏洞時發現執行這種簡單的輸入確認是不夠的。

基於應用程序執行功能的廣泛性及其採用技術的多樣性,一個典型的應用程序需要防禦大量的各種各樣的輸入攻擊,每種攻擊可能採用一種截然不同的專門設計的數據,因此很難在外部邊界建立一個簡單的機制防禦所有的攻擊。

許多應用程序功能都設計組合一系列不同的處理過程,用戶的一個輸入,可能在許多組件中執行許多操作,其中前一個操作的輸出結果被用於後一個操作。數據經過轉換後與原始輸入完全不同。而經驗豐富的攻擊者卻能利用這種不同,在關鍵步驟生成惡意數據,攻擊接受數據的組件。因此很難在外部邊界建立一個簡單的機制防禦所有的攻擊。

邊界確認是一種更加有效的模型。這裏的邊界不在侷限於因特網與web應用程序之間的邊界,web應用程序的每個組件或功能單元都有邊界。如此,每個組件都可以防禦它收到的特殊類型的專門設計的輸入。當數據通過不同的組件,即可對前面生成的數據執行確認檢查,而且由於不同的處理階段執行不同的確認檢查,它們之間不可能發生衝突。

例如下圖:

多步確認與規範化

在確認檢查過程中,當需要在幾個步驟中處理用戶的輸入時,就會出現一個輸入機制經常遇到的問題。當應用程序試圖通過刪除或者編碼某些字符達到淨化用戶輸入時,就會出現這種問題。如果不謹慎處理這個問題,攻擊者就能構造專門的輸入,使惡意數據成功避開確認機制。例如雙寫繞過、利用步驟執行順序繞過。

數據規範化會造成另一個問題。爲了通過http傳送一些不常見的字符和二進制數據,通常會通過編碼對其進行規範化,但是如何在實施過濾之後才進行解碼,攻擊者就可以通過編碼避開確認機制。

除了供web應用程序使用的標準編碼方案外,其他情況下,如果應用程序的組件將數據從一個字符集轉換爲另一個字符集,這也會導致規範化問題。例如Ÿ和Â則被轉換爲Y和A,攻擊者經常使用這種方法傳送受阻止的字符和關鍵字。

有時候很難避免多步確認和規範化造成的問題,也不存在解決和這類問題的唯一方案。如何可能一般避免淨化不良輸入,而是完全拒絕這種輸入。

應對攻擊

以上我們已經儘可能的阻止了攻擊者的入侵,但是沒有一個絕對安全的系統,若發生安全事件web應用程序應當如何應對攻擊呢,處理措施一般爲以下幾條:

1、處理預料外的報錯
2、自動阻止明顯的攻擊
3、自動向管理員發送警報
4、維護程序的訪問日誌

處理錯誤

應用程序的一個關鍵機制就是如何處理意料之外的錯誤。一般在生產環境下,應用程序不應該向用戶返回任何系統生成的信息或者其他調試信息。這些信息對於攻擊者而言是爲下一步的進攻提供了很好的參考信息。而且意料之外的錯誤往往指明瞭程序的防禦機制中的一些缺陷。錯誤處理機制通常與日誌機制整合在一起。

應對攻擊

很多攻擊都會發送大量的常見惡意字符,遇到這類情況應用程序應採取自動反應措施阻止攻擊者的探查。例如終止會話、要求重新登錄、禁止ip等等

維護日誌

日誌會對入侵情況進行記錄,入侵過後仍能還原入侵過程。

重要的應用程序日誌應記錄所有請求。一般情況下應至少包括一下幾項:

1、所有與身份驗證相關的事件,如成功或失敗的登錄、密碼修改
2、關鍵操作,如轉賬等
3、被訪問控制阻止的請求
4、包含已知攻擊字符串

日誌會記錄每個事件的時間、ip、用戶賬戶。日誌需要嚴格保護,避免未授權的讀取。寫入,修改等等

日誌同樣也會成爲一個攻擊面,例如可以未授權訪問的日誌會爲攻擊者提供會話令牌、請求參數等等敏感信息。

向管理員發出警報

核心問題就是誤報和漏報,將警報機制與確認機制和其他控制方法結合起來可以得到一些改善。

一般而言監控到的反常事件包括以下幾種:

1、應用反常,如接收到一個ip的大量的請求
2、交易反常,如一個銀行賬戶所轉入轉出的資金數量出現異常
3、包含已知攻擊字符串
4、請求中普通用戶無法查看的數據被修改

管理應用程序

管理程序可以幫助管理員管理用戶賬戶與角色、應用監控與審計功能、執行診斷任務並配置應用程序的各種功能。

管理機制是應用程序主要受攻擊面之一,管理機制往往都擁有很高的權限。獲得了管理機制控制權,就是獲得了應用程序的控制權。而且管理機制中往往會存在一些比較明顯的漏洞和敏感的功能。獲得管理員的權限的漏洞一般出現在處理用戶訪問機制上,如未授權訪問、弱口令等,如果管理後臺可以處理普通用戶發送的請求,可以嘗試xss漏洞盲打後臺。

參考:《黑客攻防技術寶典:web實戰篇》核心防禦機制

*本文作者:滅跡下的荒誕,轉載請註明來自FreeBuf.COM

相關文章