2016-09-23 102 views
3

我不是開發者,而是滲透測試者。在基於.NET框架的網站上進行Pentest測試時,我報告了「不正確的會話管理」問題。用戶使用.ASPXAUTH cookie進行了身份驗證。會發生什麼情況是用戶註銷時,客戶端瀏覽器中的.ASPXAUTH cookie值設置爲空白。但是,如果您使用相同的.ASPXAUTH,請手動將其放入瀏覽器中,並刷新頁面用戶直接進行身份驗證。

我建議開發者在用戶註銷後立即在服務器端銷燬.ASPXAUTH cookie。但他們建議cookie和會話相關的東西完全由框架管理,並且它不可能在服務器端被殺死。

那麼有沒有辦法在服務器端殺死.ASPXAUTH?如何殺死服務器端的.ASPXAUTH cookie?

預先感謝您

回答

4

那麼,有沒有辦法殺死在服務器端.ASPXAUTH?

不,沒有辦法做到這一點,因爲ASP.NET FormsAuthentication與服務器上的任何狀態都沒有關係。這是它的一個弱點。你可以做的是將這個cookie與會話狀態聯繫起來,這個狀態將會保存在服務器上。通過這種方式進行身份驗證,僅具有有效的表單身份驗證cookie是不夠的,但除此之外,它還應與服務器上的某個狀態相關聯,這些狀態可能會在任何時候失效(例如註銷時)。在這種情況下,用戶從網站註銷後,他將無法再使用該cookie,因爲假設他在獲得身份驗證時已經獲取了其值。

2

爲了擴大Darin的答案,Web Forms Cookie auth是無狀態的。你的客戶是正確的,說明框架在封面上做了很多「魔術」。儘管如此,這並不是說客戶不能做些什麼。

默認情況下,Forms Auth cookie是無狀態的。它包含某種標識符(用戶名,用戶ID,由開發者決定),就是這樣。您可以在Cookie上設置許多屬性(是否爲會話Cookie,有多長時間等),但不影響Cookie的內容處理方式。然後cookie的內容被機器密鑰加密和MAC,所以它們不能被篡改,但這並不妨礙它們的便攜性或可重放性。

客戶端可以繼續使用表單身份驗證,如果他們想要的話,他們只需要退一步從所有的魔法。

我認爲他們正在做的事情就像FormsAuthentication.SetAuthCookie。相反,他們可以創建一個允許包含用戶提供的數據的FormsAuthenticationTicket。這些數據可能與會話有關(不一定是HTTP會話)。然後使用FormsAuthentication.Encrypt加密票證,並返回一個可以在成功的身份驗證響應中設置的cookie。

當一個頁面加載(或更好的在Global.asax的Application_AuthorizeRequest)時,他們可以從請求中獲取cookie,調用FormsAuthentication.Decrypt來解密認證cookie,並檢查用戶數據是否與會話匹配。

當用戶顯式註銷時,清除該用戶的會話,以便它不再與cookie匹配。然後檢查用戶數據應拒絕cookie並強制他們獲取新的cookie。

+0

這個答案有點危險;對於非專家來說,安全性並不是很好的做法。但是,忽略此問題意味着密碼更改不**會使'.ASPXAUTH' Cookie無效(儘管Cookie具有加密的到期時間,因此最終會過期)。重申:遭受入侵的用戶無法通過密碼更改/重置來使其cookie無效。就個人而言,我會建議考慮vcsjones建議的方法。 'FormsAuthenticationTicket'有一個'userData'參數,可以很好地用於這個目的。 – Brian

+0

另請參見[SetAuthCookie]的參考源(https://referencesource.microsoft.com/#System.Web/Security/FormsAuthentication.cs,075bdc7d5fc28fdb)。 – Brian