如果有人使用 BlogEngine 1.3.0.0 版本的話,可能需要「立即」將你的版本升級至 BlogEngine 1.3.1.0 版,因為 1.3.0.0 有個嚴重的安全性漏洞可以將該網站所有使用者的帳號、密碼下載。這問題連 BlogEngine.NET 官方部落格 都被駭了。
我原本不想將這個漏洞的細節說的太清楚的,因為說的越清楚可能就會有越多人遭殃,不過這應該也是一場機會教育吧,所以我還是多說明一些好了,反正有使用 BlogEngine 1.3.0.0 Blogger 趕快升級就是了,如果自己改過很多程式的話,其實只要更新 DotNetSlave.BusinessLogic\Web\HttpHandlers\JavaScriptHandler.cs 這支程式就可以了,在這支程式的 RetrieveLocalScript 方法改掉即可。
原本的程式碼是這樣:
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;
}
然而在這個方法前面多加上幾行即可:
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;
using (StreamReader reader = new StreamReader(path))
{
script = reader.ReadToEnd();
HttpContext.Current.Cache.Insert(file, script, new CacheDependency(path));
}
return script;
}
這問題主要是出在 js.axd 這支 HttpHandler,因為沒有將下載的路徑處理好,導致可以讓任何人透過這支Handler下載網站上任意檔案,包括 web.config 與網站內所有任意檔案,這問題我們在之前也犯過一次,但那一次發現就已經很震驚了,因為所有定義在 web.config 的資料庫連線參數、密碼都被看光光,不得已只好將所有帳號、密碼全部重設!
若有人剛開始寫 HttpHandler,並且是用 HttpHandler 下載檔案的人,一定要特別特別留意這個問題,多做一些檔名的判斷才能防止漏洞產生,例如說檔名中不能任意指定其他路徑名稱,你可以多判斷檔名中是否有 / 或 .. 等字元的出現。
剛剛花了兩個小時小心翼翼的將版本升級,因為我自己 Patch 了不少原本就有的 Bug,真怕升級後問題又出現,所以也把每一支更新的程式都看過一遍,還好我有用 Subversion 做版本管理,不然每次升級都要看完所有程式碼那還真的要熬夜了。
另外,我也透過 LogParser 工具幫我找出到目前為止有幾個人透過這個漏洞看到我的密碼了(還好我發現的早沒人看過),在此分享我的 LogPaser 指令,方便部落客查一下 IIS 的 Log,以進行確認有沒有人看過你的密碼了,如果有人看過了就趕快換密碼吧!以下是查詢的步驟:
- 先下載安裝 LogParser
- 進入命列提示字元 ( 開始 -> 執行 -> cmd.exe )
- 切換至你網站的 IIS Log 目錄,例如:C:\WINDOWS\system32\LogFiles\W3SVC1137020394
- 執行 LogParser 指令將篩選過的資料匯出:
LogParser "SELECT date, time, cs-uri-stem, cs-uri-query, c-ip, cs(User-Agent) FROM *.log WHERE cs-uri-stem like '%js.axd%' and cs-uri-query like '%users.xml%'" -i:W3C -o:CSV
輸出的結果大概長這樣,如果有可疑的IP那就是中標啦! (P.S. 底下的IP是我亂打的):
2008-04-15,13:54:05,/js.axd,path=/app_data/users.xml,127.198.10.85
2008-04-15,13:54:19,/js.axd,path=/app_data/users.xml,129.218.2.1
2008-04-15,14:17:46,/js.axd,path=/app_data/users.xml,182.232.123.123
Statistics:
-----------
Elements processed: 310655
Elements output: 4
Execution time: 8.72 seconds
相關連結