該漏洞是在上周五的一個安全會議上發現的。我們建議所有的客戶立即采取補救措施(見下文)來預防攻擊者利用此漏洞攻擊您的ASP.NET站點。
通過該安全漏洞能夠做什麼?
潛在的攻擊者可以通過該漏洞來下載下傳ASP.NET 應用程式中的檔案,比如Web.config (它經常包含一些敏感資料)。
通過進一步利用該漏洞,攻擊者可以解密發送到用戶端的加密資料(如儲存在頁面中的ViewState)。
如何利用該漏洞
要了解該漏洞的原理,您需要先了解密鑰神谕,即向一個加密系統發出問題,而它會給暗示。目前的這個漏洞就扮演了這樣一個跳闆,可以讓攻擊者不斷向伺服器發送加密過的資料,通過檢測傳回的錯誤碼了解它是否能被解密,經過許多次嘗試後,攻擊者可以得到足夠多的經驗來解密剩餘的加密内容。
避免該漏洞的臨時方案
一個來避免該漏洞的替代辦法就是啟用ASP.NET的 <customErrors>,并且對它進行顯式配置,使得不管伺服器發生什麼樣的錯誤都總是傳回相同的錯誤頁。通過将不同的錯誤映射到同一個錯誤頁,可以避免讓攻擊者辨識在伺服器上産生的不同錯誤類型。
注意: 僅僅将customErrors設定為RemoteOnly是不夠的。您必須确認所有的錯誤都傳回相同的錯誤頁,這需要您顯示地設定customErrors節點的defaultRedirect屬性,并确認它沒有隻針對特定的狀态碼。
在ASP.NET V1.0到V3.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> 将所有的錯誤映射到相同的錯誤頁。
2) 建立或修改 <customErrors> 節點,并作如下設定,.NET 3.5 SP1 and .NET 4.0中還需要設定redirectMode=”ResponseRewrite”:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/error.aspx" />
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" %>
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(); }
}
An error occurred while processing your request.
驗證<customErrors>節點是否已被正确設定
如果您看到之前設定的錯誤頁被顯示(因為您請求的檔案不存在),那麼配置就是正确的。而如果您看到一個标準的ASP.NET錯誤,則可能是您缺失了上面某個步驟。如果想檢視導緻錯誤的更多資訊,您可以嘗試設定 <customErrors mode=”remoteOnly” /> ——隻在伺服器上的本地浏覽器進行連接配接時才可以看見這些錯誤消息。
安裝URLScan并啟用一個自定義規則
· x86 版本
隻需要不到一分鐘就可以将它安裝到你的伺服器上。
增加一個新的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應用程式
它會标記出那些有問題的應用程式,比如在Web.config中沒有設定 <customErrors />節點 (需要進行添加),或沒有按照正确的方法進行設定(你需要修改它),如果每個應用程式都沒有問題,它則會列印出“OK”的結果,這應該很容易的找出潛在的問題。
注意: 我們僅僅在前面幾個小時内完成了這個檢測腳本,将在以後對它進行完善,一有修改我即會在這裡釋出更新。
關于此漏洞的更多資訊
您可以從下面這些地方了解更多關于該漏洞的資訊:
<b>本文轉自tiasys部落格園部落格,原文連結:</b><b>http://www.cnblogs.com/tiasys/archive/2012/05/21/2511664.html</b><b>,如需轉載請自行聯系原作者</b>