2013-09-24 73 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 –