BlogEngine 1.3.1.0 ve 1.3.0.29 sürümlerinden düşük sürümler kullanan BlogEngine kurulu site sahiplerini etkileyen ciddi bir açık yakın zamanda açıklandı. Çözüm için http://codeplex.com/blogengine sayfasından 1.3.1 güncel sürümünü indirebilir ya da son sürümleri kendiniz derliyorsanız şu değişiklikleri gerekli dosyalarda yapabilirsiniz.
Not: Aşağıda anlatılanlar bilgilendirme amaçlıdır. Anlatılanların uygulanmasından dolayı oluşan sonuçlar bu yazının yazarının sorumluluğunda değildir.
Öncelikle BlogEngine.Core.dll'i oluşturan BlogEngine.Core projesinin altında "\Web\HttpHandlers\JavaScriptHandler.cs" dosyasında bulunan RetrieveLocalScript metodunu sadece javascript uzantılı dosyalara ulaşacak şekilde değiştirmeniz gerekiyor.
Açığın bulunduğu kod parçası:
[code=csharp]/// <summary>
/// Retrieves the local script from the disk
/// </summary>
private static string RetrieveLocalScript(string file)
{
string path = HttpContext.Current.Server.MapPath(file);
string script = null;
if (File.Exists(path))
{
using (StreamReader reader = new StreamReader(path))
{
script = reader.ReadToEnd();
script = StripWhitespace(script);
HttpContext.Current.Cache.Insert(file, script, new CacheDependency(path));
}
}
return script;
}[/code]
Açık kapatılmış hali:
/// <summary>
/// Retrieves the local script from the disk
/// </summary>
private static string RetrieveLocalScript(string file)
{
if (!file.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
{
throw new System.Security.SecurityException("No access");
}
string path = HttpContext.Current.Server.MapPath(file);
string script = null;
if (File.Exists(path))
{
using (StreamReader reader = new StreamReader(path))
{
script = reader.ReadToEnd();
script = StripWhitespace(script);
HttpContext.Current.Cache.Insert(file, script, new CacheDependency(path));
}
}
return script;
}
Yukarıda görüldüğü gibi öncesinde bu metod sizin belirttiğiniz sitenizdeki tüm dosyaları geri getirecek şekilde çalışıyordu. Daha açık konuşmak gerekirse http://www.muratduman.net/js.axd?path=web.config şeklindeki bir adresi tarayıcınıza yazdığınızda size geri dönen js.axd dosyasını kaydedip içine baktığınızda sitedeki web.config dosyasını görebilirdiniz (Şu an benim sitemdeki açık kapatılmış durumda). Bunun üzerine gidip http://www.muratduman.net/js.axd?path=App_data/users.xml şeklinde bir adres yazıp salt metin olarak kaydedilmiş olan tüm şifreleri de almanız söz konusu.
Ayrıca search.aspx sayfasında da sonuçlar QueryString'den Encode edilmeden alınıyordu.
<input type="text" name="q" id="q" value="<%=Request.QueryString["q"] %>" onkeypress="if(event.keyCode==13) SearchPage()" />
Bu bölüme de uygulanabilecek bir enjeksiyon ile site üzerinde istediğiniz işlemi yapmanız mümkün. Düzeltmek için ise kök (root) dizinde bulunan search.aspx sayfasındaki yukarıdaki kısmı bulup aşağıdaki HtmlEncode edilmiş şekli ile değiştirmeniz gerekiyor. (1.3.1.0 ve 1.3.0.29 ve üzeri sürümlerde açık kapatılmış durumda)
<input type="text" name="q" id="q" value="<%=Server.HtmlEncode(Request.QueryString["q"]) %>" onkeypress="if(event.keyCode==13) SearchPage()" />
BlogEngine kullanan arkadaşlar lütfen bu açıkları en kısa zamanda kapatalım ve bloglarımızı yeni sürümlerine yükseltelim. Sitelerimizden diğer BlogEngine sahiplerine de duyurmaya özen gösterelim. Şifrelerimizi de kısa aralıklarla değiştirmeyi unutmayalım.
P.S: Uzun bir aradan sonra yazılarıma ve blog'uma tekrar geri döndüm. Kritik birşeyler gerekiyormuş demek ki :)
Duyurular için öncelikle Burak Sarıca başta olmak üzere Berk Gürakan ve Ali Rıza Babaoğlan'a teşekkürler.