2013-03-06 177 views
2

我们有一些安全/渗透测试人员测试我们的ASP.NET应用程序,他们发现了一些被认为是跨站点脚本漏洞的东西。从我所知道的情况来看,它们看起来像是他们通过将文本<ScRiPt>alert(1)</ScRiPt>插入到其中一个视图状态参数中来手动操纵回发的视图状态。出于某种原因,即使我们在web.config中指定了自定义错误处理程序,但服务器似乎忽略了它们,只是逐个显示视图状态,然后回传一条通用错误消息。因此,<ScRiPt>alert(1)</ScRiPt>在浏览器中运行,导致测试人员将其识别为跨站点脚本问题。无论这是否是合法的漏洞,我希望能够正确处理此错误并将其重定向到我们的自定义错误页面之一,或者至少防止服务器随意返回视图状态错误信息。处理无效的视图状态错误

除了查看IIS中网站的.NET错误页面和错误页面外,我还尝试了在global.asax的Application_Error方法中做些事情。在那里我可以看到状态码是500,WebEventCode是System.Web.Management.WebEventCodes.RuntimeErrorViewStateFailure,但是我不能在那里做一个Response.Redirect或Server.Transfer,因为我得到一个“Response.Redirect不能被调用在页面回调中“。例外。我也尝试将EnableViewStateMac设置为true,将ViewStateEncryptionMode设置为始终在web.config中,以查看这是否会改变事情,但我仍然能够重新创建问题。我会很感激任何人可能有的洞察力。

我越来越从服务器返回的错误响应看起来是这样的:

0|/*DX*/({'generalError':'Invalid viewstate. \r\n\tClient IP: 127.0.0.1\r\n\tPort: 51510\r\n\tReferer: https://localhost/-mysettings.aspx\r\n\tPath: /Default.aspx\r\n\tUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1\r\n\tViewState: /wEPDwUKMjA1OTAyNzk1MWQYBAUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFjQFQmN0bDAxJG1haW5Db250ZW50JGN0bDAwJGNwQWRtaW5pc3RyYXRpb25TZXR0aW5ncyRidG5DaGFuZ2VQYXNzd29yZAU/Y3RsMDEkbWFpbkNvbnRlbnQkY3RsMDAkY3BBZG1pbmlzdHJhdGlvblNldHRpbmdzJGJ0bkVkaXRQaWN0dXJlBT9jdGwwMSRtYWluQ29udGVudCRjdGwwMCRjcEFkbWluaXN0cmF0aW9uU2V0dGluZ3MkYnRuU2F2ZUNoYW5nZXMFQmN0bDAxJG1haW5Db250ZW50JGN0bDAwJGNwQWRtaW5pc3RyYXRpb<ScRiPt>alert(1)</ScRiPt>25TZXR0aW5ncyRjYlNpdGVDb3VudHJ5JERERAU8Y3RsMDEkbWFpbkNvbnRlbnQkY3RsMDAkY3BBZG1pbmlzdHJhdGlvblNldHRpbmdzJEFTUHhCdXR0b24zBV9jdGwwMSRtYWluQ29udGVudCRjdGwwMCRjcEFkbWluaXN0cmF0aW9uU2V0dGluZ3MkdXNlckFkZHJlc3MkcG5sQWRkcmVzcyRjYlNlYXJjaGFibGVBZGRyZXNzJERERAU8Y3RsMDEkbWFpbkNvbnRlbnQkY3RsMDAkY3BBZG1pbmlzdHJhdGlvblNldHRpbmdzJEFTUHhCdXR0b24yBT9jdGwwMSRtYWluQ29udGVudCRjdGwwMCRjcEFkbWluaXN0cmF0aW9uU2V0dGluZ3Mk...'}) 
+0

对于安全性/渗透测试人员收取IME量,他们不建议的方式,以避免?如果您在现实生活中遇到错误,那么这是MITM攻击,或者最终用户的计算机已经感染了恶意软件,或者是有人故意搞乱视图状态。无论这些人是谁,您的网站都已正确拒绝处理该请求,并且不良数据将不会再传播。我有一个渗透测试报告说“。aspx“是一个漏洞,因为它表明正在使用IIS。 – 2013-03-06 22:37:03

回答

0

他们操纵网页的源代码添加脚本代码,然后执行。这不是任何一本书的漏洞(因为价值并没有持续存在,警报只是作为他们行为的直接结果而执行 - 就像他们自己正在黑客攻击一样)。没有什么能够阻止他们直接在页面中添加该脚本...

至于错误消息,您应该查看您的web.config文件中的设置<customErrors mode="On" />MSDN reference

如果这没有帮助,另一种选择是清除Application_Error中的异常并抛出一个通用异常。

+1

我已经尝试过,它适用于大多数情况,但由于某些原因,此特定错误绕过它或永远不会得到它。刚才我也尝试在Application_Error中抛出泛型异常和新的HttpException,但是这并没有改变响应。关于漏洞,我想理论上可能有人可以在钓鱼攻击中使用它。例如,通过查询字符串传递这种类型的视图状态数据,并诱骗人们通过合法的SSL证书在合法的URL上输入数据。 – Graham 2013-03-06 22:00:10

3

我能够想出一个可行的解决方案。这不是完美的,但完成了工作,并防止JavaScript出现在服务器的响应。我基本上只是清除当前的错误,并输出我自己的自定义响应。我把在Global.asax的Application_Error事件下面的代码:

//Handle view state manipulation 
HttpApplication httpApp = this.Context.ApplicationInstance; 
HttpException httpEx = httpApp.Server.GetLastError() as HttpException; 
if (httpEx != null) 
{ 
    if (
     httpEx.WebEventCode == System.Web.Management.WebEventCodes.AuditInvalidViewStateFailure 
     || 
     httpEx.WebEventCode == System.Web.Management.WebEventCodes.InvalidViewState 
     || 
     httpEx.WebEventCode == System.Web.Management.WebEventCodes.InvalidViewStateMac 
     || 
     httpEx.WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorViewStateFailure 
     ) 
    { 
     HttpContext.Current.ClearError(); 
     Response.Write("Error: An invalid viewstate has been detected (WebEventCode: " + httpEx.WebEventCode.ToString() + ")."); 
    } 
}