3

我们让一些安全/渗透测试人员测试了我们的 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在页面回调中。” 例外。我还尝试在 web.config 中将 EnableViewStateMac 设置为 true 并将 ViewStateEncryptionMode 设置为 Always 以查看这是否会改变事情,但我仍然能够重新创建问题。我很感激有人可能有任何见解。

我从服务器返回的错误响应如下所示:

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...'})
4

3 回答 3

5

我能够想出一个可行的解决方案。它并不完美,但可以完成工作并防止 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() + ").");
    }
}
于 2013-03-07T22:06:58.417 回答
0

我们有同样的问题要通过 PCI 测试。

我认为下面的这个链接解决了这个问题,但我不知道如何修复它。 http://computersecuritywithethicalhacking.blogspot.co.uk/2012/09/stored-xss-via-viewstate-parameter.html

我们使用 IIS 7.5,在我们的网站上,enableviewstate 为 true,enableviewstatemac 为 true。但我不知道如何检查 viewStateEncryptionMode 设置。我不确定视图状态是否已加密。

于 2013-03-07T13:19:05.330 回答
0

他们操纵页面源以添加然后执行的脚本代码。这不是任何一本书的漏洞(因为该值没有持久化,并且警报仅作为他们行动的直接结果执行——就像他们在攻击自己一样)。没有什么能阻止他们直接在页面中添加该脚本......

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

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

于 2013-03-06T20:49:25.920 回答