2013-09-24 94 views
5

使用Acunetix掃描我的Web應用程序後,結果顯示9個「在重定向頁面中找到HTML表單」的實例。 HTTP標題的重現性試驗攻擊如下:網站安全測試顯示Response.Redirect易受攻擊

Request 
GET /entities/add HTTP/1.1 
Pragma: no-cache 
Referer: https://test.mysite.com/entities/view 
Acunetix-Aspect: enabled 
Acunetix-Aspect-Password: 082119f75623eb7abd7bf357698ff66c 
Acunetix-Aspect-Queries: filelist;aspectalerts 
Cookie: __AntiXsrfToken=97c0a6bb164d4121b07327df405f9db4; mysitecookie= 
Host: test.mysite.com 
Connection: Keep-alive 
Accept-Encoding: gzip,deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Acunetix-Product: WVS/8.0 (Acunetix Web Vulnerability Scanner - NORMAL) 
Acunetix-Scanning-agreement: Third Party Scanning PROHIBITED 
Acunetix-User-agreement: http://www.acunetix.com/wvs/disc.htm 
Accept: */* 

Response 
HTTP/1.1 302 Found 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Location: /login 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
Set-Cookie: mysitecookie=; expires=Mon, 11-Oct-1999 22:00:00 GMT; path=/; HttpOnly 
X-Powered-By: ASP.NET 
Date: Tue, 24 Sep 2013 10:38:12 GMT 
Content-Length: 9447 

響應的Location: /login部分使我相信,如果我最終將用戶重定向到登錄頁面後的反應時,該漏洞就會被接通。所以我改變了這種代碼的所有實例:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Redirect("/login"); 
    } 
    else 
    { 
     // etc 
    } 
} 

到:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Redirect("/login", true); 
    } 
    else 
    { 
     // etc 
    } 
} 

可能是什麼原因,它仍然顯示爲弱勢?

+0

Acunetix有很多文檔。不要問這裏的人,你爲什麼不讀Acunetix文檔? http://www.acunetix.com/blog/web-security-zone/html-form-found-in-redirect-page/描述你的特定場景。這裏的理論問題是,您可能已經將* actual *頁面*與*一起重定向到登錄頁面。 – bzlm

回答

1

由於頁面中存在HTML表單以及響應頭中的重定向,因此會引發標誌。我認爲這是一個漏洞,因爲它可以讓未經驗證的用戶瞭解您的應用程序的工作方式。你可以做什麼來防止這個標誌被提出是在重定向之前清除你的迴應。

嘗試以下操作:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Clear(); 
     Response.Redirect("/login", true); // btw true is the default... 
    } 
    else 
    { 
     // etc 
    } 
} 

如果你設置會話變量,餅乾等,那麼你就需要調整一個位,所以你肯定一切使得它成爲響應例如使用endResponse = false,Response.End();返回;等等

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.clear.aspx

+0

Clear方法不會清除標頭信息.'這是我在您建議的鏈接中找到的東西,您能否解釋它因爲我在網絡技術方面也是新的,這兩個陳述似乎有衝突。 –

+2

HTTP請求和響應由標題和正文(和方法,請參閱下面的鏈接)組成。在你的情況,你的標題是說「不」(重定向),但你的身體通過發送(至少一些)HTML表單來說「是」(對不起,我無法抗拒)。如果你想使用不同的方法,你可以清除標題,但在你的情況下,你不想清除標題(你希望它重定向),你只需要清除標題。 http://geekexplains.blogspot.com/2008/06/whats-http-explain-http-request-and.html – mikey

+0

感謝+1幫助。 –

0

Response.Redirect向客戶端發送額外往返(響應代碼302)。這意味着客戶必須調用「新」URL。這通常是你不想做的事情。

在.Net中,您也可以直接在服務器上執行重定向,這意味着無需額外往返。

而不是Response.Redirect你想調用Server.Transfer或Server.TransferRequest(這是需要集成應用程序池的新方法)。

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transferrequest.aspx

如果Server是不是在你的上下文中可用,您還可以在HttpContext.Current發現HttpServerUtility一個實例。

+0

此答案與報告的漏洞或其解析無關。 [請參閱此答案以獲取更多信息。](http://stackoverflow.com/a/18986165/7724) – bzlm

+1

因爲它。做Response.Redirect不是一件好事,因爲它會導致額外的流量,並且通常被視爲潛在的安全漏洞。 這就是爲什麼你想要重定向到服務器上的自己的網站,而不是發送302到客戶端... 這正是路由的工作原理。而且/登錄似乎是在同一個服務器/網站,這是一個有效的選項,不會導致任何問題... – MichaC

+0

對不起,你正在比較蘋果和橘子。在Acunetix上檢查鏈接到的答案以及針對此特定報告的漏洞的描述的鏈接。此外,有關「Response.Redirect」不是「好東西」的評論只是無稽之談。 :) – bzlm

0

嗯,我不能什麼規定 - Acunetix說計算漏洞,但我可以建議你使用response.redirect("url",false)過載 - check here

如果指定endResponse參數true,則此方法調用原始請求End方法,它在完成時拋出一個ThreadAbortException異常。此異常對Web應用程序性能有不利影響,因此建議爲endResponse參數傳遞false。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Clear(); 
     Response.Redirect("/login", false); 
     Context.ApplicationInstance.CompleteRequest(); 
    } 
    else 
    { 
     // etc 
    } 
} 

Context.ApplicationInstance.CompleteRequest(); 導致ASP.NET繞過所有事件和過濾在HTTP執行管線鏈和直接執行EndRequest事件。 它繞過引起的事件ThreadAbortException.

+0

[Acunetix自己可以說他們計算漏洞的標準是什麼。](http://www.acunetix.com/blog/web-security-zone/html-form-found-in-redirect-page/) – bzlm

+0

@bzlm謝謝爲鏈接。許多Web瀏覽器以違反此標準的方式實現此代碼,無論原始請求中使用哪種類型(例如POST),都將新請求的請求類型更改爲GET-http://en.wikipedia.org/wiki/HTTP_302 –

+0

@bzlm根據截圖顯示的方法類型爲「GET」,那麼是否有任何方法可以避免這種情況,或者用戶必須應對這種情況。 http://www.acunetix.com/wp-content/uploads/2012/02/html-form-redirect-redirpage-302.png –