ASP.NET安全漏洞

简介:

几个小时前,我们发布了一个关于ASP.NET安全漏洞的Microsoft 安全警告,该漏洞存在于目前所有的ASP.NET版本。

该漏洞是在上周五的一个安全会议上发现的。我们建议所有的客户立即采取补救措施(见下文)来预防攻击者利用此漏洞攻击您的ASP.NET站点。

9月20日更新: 我发布了另一篇博客,其中包含关于此问题的一些FAQ,您可以从这里阅读。

9月24日更新: 我发布了另一篇博客,关于在补救措施中启用URLScan,您可以从这里阅读。

通过该安全漏洞能够做什么?

潜在的攻击者可以通过该漏洞来下载ASP.NET 应用程序中的文件,比如Web.config (它经常包含一些敏感数据)。

通过进一步利用该漏洞,攻击者可以解密发送到客户端的加密数据(如保存在页面中的ViewState)。

如何利用该漏洞

要理解该漏洞的原理,您需要先了解密钥神谕,即向一个加密系统发出问题,而它会给暗示。目前的这个漏洞就扮演了这样一个跳板,可以让攻击者不断向服务器发送加密过的数据,通过检测返回的错误码了解它是否能被解密,经过许多次尝试后,攻击者可以得到足够多的经验来解密剩余的加密内容。

避免该漏洞的临时方案

一个来避免该漏洞的替代办法就是启用ASP.NET的 <customErrors>,并且对它进行显式配置,使得不管服务器发生什么样的错误都总是返回相同的错误页。通过将不同的错误映射到同一个错误页,可以避免让攻击者辨别在服务器上产生的不同错误类型。

注意: 仅仅将customErrors设置为RemoteOnly是不够的。您必须确认所有的错误都返回相同的错误页,这需要您显示地设置customErrors节点的defaultRedirect属性,并确认它没有只针对特定的状态码。

在ASP.NET V1.0V3.5版本上启用临时方案

如果您正在使用ASP.NET 1.0, ASP.NET 1.1, ASP.NET 2.0 或者 ASP.NET 3.5,那么您可以通过下面的步骤来设置 <customErrors> 将所有的错误映射到相同的错误页。

1) 编辑ASP.NET 应用程序根目录下的Web.config文件,如果文件不存在,则在应用程序的根目录下创建一个。.

2) 创建或修改 <customErrors> 节点,并做如下设置:

<configuration>

<system.web>

<customErrors mode="On" defaultRedirect="~/error.html" />

</system.web>

</configuration>

3) 您可以在您的程序增加一个适当的error.html文件(可以包含您喜欢的任意内容),当应用程序发生任何服务器端错误时就会显示这个页面。

注意:一个重要的事情就是customErrors节点的mode属性必须设置成 “On”,这样所有的错误才会被重定向到设定的错误页。并且必须不对它指定任何错误状态码——也就是说 <customErrors /> 节点没有任何子节点。这是做是为了避免攻击者能够区分服务器发生的错的类型,并且预防信息泄露。

在ASP.NET V3.5 SP1或ASP.NET 4.0版本上启用临时方案

如果您正在使用ASP.NET 3.5 SP1 或 ASP.NET 4.0,则可以通过下面的步骤来设置 <customErrors> 将所有的错误映射到相同的错误页。

1) 编辑ASP.NET 应用程序根目录下的Web.config文件,如果文件不存在,则在应用程序的根目录下创建一个。.

2) 创建或修改 <customErrors> 节点,并作如下设置,.NET 3.5 SP1 and .NET 4.0中还需要设置redirectMode=”ResponseRewrite”:

<configuration>

<system.web>

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/error.aspx" />

</system.web>

</configuration>

3) 您可以在您的程序增加一个适当的error.aspx文件(可以包含您喜欢的任意内容),当应用程序发生任何服务器端错误时就会显示这个页面。

4) 我们推荐您在Error.aspx文件的服务器端Page_Load() 事件中增加下面的代码,设计一个小小的随机延迟,这将能帮助混淆错误。

VB 版本

下面是您可以使用的VB版本的Error.aspx ,在代码中实现了一个随机的延迟。您不需要将它和您的应用程序一起编译——只需随意地把Error.aspx文件保存到服务器上的某个应用程序目录。

<%@ Page Language="VB" AutoEventWireup="true" %>

<%@ Import Namespace="System.Security.Cryptography" %>

<%@ Import Namespace="System.Threading" %>

<script runat="server">

Sub Page_Load()

Dim delay As Byte() = New Byte(0) {}

Dim prng As RandomNumberGenerator = New RNGCryptoServiceProvider()

prng.GetBytes(delay)

Thread.Sleep(CType(delay(0), Integer))

Dim disposable As IDisposable = TryCast(prng, IDisposable)

If Not disposable Is Nothing Then

disposable.Dispose()

End If

End Sub

</script>

<html>

<head runat="server">

<title>Error</title>

</head>

<body>

<div>

Sorry – an error occured

</div>

</body>

</html>

C# 版本

下面是您可以使用的C#版本的Error.aspx ,在代码中实现了一个随机的延迟。您不需要将它和您的应用程序一起编译——只需随意地把Error.aspx文件保存到服务器上的某个应用程序目录。

<%@ Page Language="C#" AutoEventWireup="true" %>

<%@ Import Namespace="System.Security.Cryptography" %>

<%@ Import Namespace="System.Threading" %>

<script runat="server">

void Page_Load() {

byte[] delay = new byte[1];

RandomNumberGenerator prng = new RNGCryptoServiceProvider();

prng.GetBytes(delay);

Thread.Sleep((int)delay[0]);

IDisposable disposable = prng as IDisposable;

if (disposable != null) { disposable.Dispose(); }

}

</script>

<html>

<head runat="server">

<title>Error</title>

</head>

<body>

<div>

An error occurred while processing your request.

</div>

</body>

</html>

验证<customErrors>节点是否已被正确设置

当完成上述配置后,您可以测试它来验证设置是否正确且生效,比如在您的网站上请求类似这样的URL:http://mysite.com/pagethatdoesnotexist.aspx

如果您看到之前设置的错误页被显示(因为您请求的文件不存在),那么配置就是正确的。而如果您看到一个标准的ASP.NET错误,则可能是您缺失了上面某个步骤。如果想查看导致错误的更多信息,您可以尝试设置 <customErrors mode=”remoteOnly” /> ——只在服务器上的本地浏览器进行连接时才可以看见这些错误消息。

安装URLScan并启用一个自定义规则

如果您还没有安装IIS URLScan组件,请下载并进行安装:

·        x86 版本

·        x64 版本

只需要不到一分钟就可以将它安装到你的服务器上。

增加一个新的URL扫描规则

URLScan安装完毕后,在以下位置找到UrlScan.ini文件,打开并修改它:

·        %windir%\system32\inetsrv\urlscan\UrlScan.ini

在靠近UrlScan.ini文件内容底部,您可以找到 [DenyQueryStringSequences] 节点,在紧跟它的下面的地方增加 “asoxerrorpath=”并保存:

[DenyQueryStringSequences]

aspxerrorpath=

上面这条规则可以禁止URL在QueryString中包含 “aspxerrorpath=” 这样的属性,如果有,则服务器会返回一个HTTP错误。有了这个规则就可以避免使攻击者区分服务器上的错误类型——即可以阻挡攻击者利用这个漏洞。

保存以上修改以后,在命令提示符(需要管理员权限)中运行iisreset使它生效。您可以通过向服务器的网站或应用程序请求QueryString中包含aspxerrorpath关键字的URL地址,来验证它是否成功,正常情况下IIS应该发回一个HTTP错误。

在Web服务器上找出存在安全漏洞的ASP.NET应用程序

我们发布了一个.vbs脚本文件,您可以保存到Web服务器并运行它,来检测是否有ASP.NET应用程序没有关闭 <customErrors />,或它只针对某些错误状态码。

您可以从这里下载这个.vbs脚本文件。只要把脚本内容复制/粘贴到一个记事本文件,比如”DetectCustomError.vbs”,并保存到硬盘。打开一个命令提示符窗口(需要管理员权限),然后运行csript DetectCustomErrors.vbs,它会列出Web服务器上的所有网站应用程序并检查<customErrors />设置是否正确。

它会标记出那些有问题的应用程序,比如在Web.config中没有设置 <customErrors />节点 (需要进行添加),或没有按照正确的方法进行设置(你需要修改它),如果每个应用程序都没有问题,它则会打印出“OK”的结果,这应该很容易的找出潜在的问题。

注意: 我们仅仅在前面几个小时内完成了这个检测脚本,将在以后对它进行完善,一有修改我即会在这里发布更新。

关于此漏洞的更多信息

您可以从下面这些地方了解更多关于该漏洞的信息:

·        Microsoft Security Advisory 2416728

·        Understanding the ASP.NET Vulnerability

·        Microsoft Security Response Center Blog Post



本文转自tiasys博客园博客,原文链接:http://www.cnblogs.com/tiasys/archive/2012/05/21/2511664.html,如需转载请自行联系原作者

相关文章
|
Web App开发 安全 .NET
ASP 常见的安全漏洞
ASP 常见的安全漏洞 日期:2006-08-11     ASP 的漏洞已经算很少的了,想要找到数据库的实际位置也不简单,但这不表明黑客无孔可入,也正是这个观点,一般的程序设计员常常忘记仔细的检查是否有漏洞,所以才有可能导致网站资料被窃取的事件发生。
1339 0
|
Web App开发 安全 .NET
一起谈.NET技术,ASP.NET 安全漏洞临时解决方案
  在上周五一个安全会议上披露了微软ASP.NET的一个安全漏洞,利用该漏洞攻击者可以请求并下载一些ASP.NET Web.config文件,攻击者可以发送密文并根据默认错误页信息来得到Machine Key。
897 0
|
Web App开发 安全 .NET
ASP.NET惊爆新安全漏洞 攻击者可访问任意文件
微软安全响应中心近日发布最新安全预警, 提醒广大ASP.NET用户防范一处新安全漏洞。攻击者可利用存在于ASP.NET加密模块的一处最新漏洞访问到包括web.config在内的任何文件。 此漏洞存在于ASP.NET所有已发布的版本中,其影响程度不容小视。
1262 0
|
安全 .NET Shell
ASP木马Webshell安全解决办案
注意:本文所讲述之设置方法与环境:适用于Microsoft Windows 2000 Server/Win2003 SERVER   IIS5.0/IIS6.0       1、首先我们来看看一般ASP木马、Webshell所利用的ASP组件有那些?我们以海洋木马为列:    〈object ru.
1503 0
|
Oracle 安全 关系型数据库
详解ASP.NET的最新安全漏洞,Padding Oracle攻击原理及其他
微软在9月17日中午正式对外公布了ASP.NET平台下的安全漏洞,即Microsoft Security Advisory (2416728)。 SecurityFocus上已将此漏洞定义成了"Design Error",那么微软一开始的设计就是错误的,为什么这么说呢?且待我们慢慢来分析。
987 0
|
安全 .NET 分布式数据库
asp与网站安全的初步构想(1)——操作系统安全
今天是2006年3月8日,现祝福所有的女性朋友节日快乐。 早上起床,收到朋友的短信,帮助她确定一下毕业设计的题目。 她是搞计算机的,但是现在的中国教育就是如此,教你很高深的理论知识,但是实际的动手的东西就比较少了,虽然她的成绩很好,但是真正设计到毕业设计的实际动手的时候,他自己也开始担心了。
656 0
|
安全 .NET
ASP安全检测类
作者:孤剑 时间:2006-9-27 0 and len(InvaildWord(i))>0 Then      p_hError=&H11010102 '发现非法字符      m_msg = m_msg & " " & InvaildWord(i) &...
559 0