在ASP.NET StartKit TimeTracker中由於程式設計上的小失誤,我們可以利用這個BUG來達到越權訪問aspx頁面的能力.
我們都知道該系統定義了三種角色,分別為
Administrator(管理員)
Project Manager(專案管理者)
Consultant(顧問)
只有Administrator角色的使用者才可以訪問管理資訊頁面(ProjectList.aspx)
現在我來描述一下錯誤現象:
現在我有一個管理員的帳戶ai_ai@126.com.
我們先用這個帳戶登陸,去建立一個Consultant角色的帳戶:ai_c@126.com
然後馬上關閉瀏覽器.(注意我這裡說的關閉是用MOUSE點擊瀏覽器關閉按鈕而不是用程式提供的登出按鈕)
再開啟瀏覽器進入登陸頁,用帳戶:ai_c@126.com登陸系統.
這時我們就可以利用顧問角色的帳戶訪問管理資訊頁面
http://localhost/TTWebCSVS_cn/ProjectList.aspx?index=2
這個BUG豈不是和系統角色存取權限相背.
現在讓我們來找蟲
我們可以看到該系統的登陸使用者角色資訊是存放在一個COOKIE中的.
資料存放前進行了加密,利用了類FormsAuthentication.Encrypt的靜態方法.
該COOKIE的名稱在Global中定義為一個常量:
public const string UserRoles = "userroles"
這就是BUG之一
現在我們再看Global中Application_AuthenticateRequest事件中另一段代碼:
Response.Cookies[UserRoles].Value = cookieStr;
Response.Cookies[UserRoles].Path = "/";
Response.Cookies[UserRoles].Expires = DateTime.Now.AddMinutes(1);
從以上我們可以得知,該COOKIE的有效時間是一分鐘.
這樣我們在前一登陸帳戶關閉後,一分鐘內馬上利用另一帳戶登陸,這樣後面的帳戶可以取到前一帳戶的角色資訊.
因為2個登陸帳戶用的是同一個叫userroles的COOKIE
這又是BUG之一