在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之一