2016-04-14 61 views
1

我在C#中有一個項目,它在登錄屏幕後面有一些管理功能。如何防止註銷後重新使用授權

在最近的pentest測試中,我們遭受了潛在的攻擊:如果用戶提交表單,註銷表單並重復表單發佈(使用burp或類似工具),服務器仍將其視爲已登錄並正確響應。

整個'Admin'控制器設置爲[Authorize]並設置了適當的角色。在註銷時,我打電話給

FormsService.SignOut(); 
Session.Clear(); 
Session.Abandon(); 

並將用戶重定向到開始頁面。

我讀過的一切都表明,這應該是我需要做的所有事情,以防止發生這種情況。這就是說,我可以做到以下幾點:

  1. 登錄到我的行政區域
  2. 進行搜索(一個JSON POST操作,在打嗝捕獲)
  3. 查看搜索結果
  4. 註銷
  5. 在burp中重複JSON POST(其中包含'.ASPXAUTH'cookie)
  6. 查看Burp中與早期響應匹配的服務器響應

我能做些什麼來防止這種情況發生?

+0

一般來說,爲了防止重放攻擊,您可以使用隨機數的質詢 - 響應身份驗證。 –

+0

'Session.Abandon'應該清除服務器端會話;這不應該工作。 – SLaks

+0

@SLaks:所以我讀過。但它仍然存在。我自己做了測試。 – Jeff

回答

0

因此經過很多實驗後,我找到了解決方案!

當用戶登錄時,我做到以下幾點:

System.Web.HttpContext.Current.Application.Lock(); 
System.Web.HttpContext.Current.Application[HttpContext.User.Identity.Name] = true; 
System.Web.HttpContext.Current.Application.UnLock(); 

,並在用戶註銷(殺害會議之前簽署能出來FormsService的),我扭轉它。

然後,我走的事實,即我們已經有了一個custom AuthorizeAttribute override在「OnAuthorization」的方法來做到這一點:

/* Some other customer stuff that isn't relevant */ 

base.OnAuthorization(filterContext); 

if (System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name] != null && 
    ((bool)System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name]) == true) 
{ 
    //The user is ok to log in, and should be validated now. 
} 
else 
{ 
    HandleUnauthorizedRequest(filterContext); 
} 

通過存儲用戶的登錄應用程序狀態的狀態,我能夠確認他們的登錄狀態。

有些人似乎認爲靜態類會比在MVC中訪問應用程序狀態更好,但在這種情況下,應用程序對我來說更好(主要是因爲其他人將更熟悉它將維護代碼和簡單的單元測試)。