代码阅读总结之ASP.NET StartKit TimeTracker(角色权限之捉虫笔记)
在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之一
为了解决这个BUG,我们可以对程序越微修改
就是把COOKIE名称唯一化.
在protected void Application_AuthenticateRequest(Object sender, EventArgs e)
中
在代码
if (Request.IsAuthenticated == true)
{
后面添加
string UserRoles=Global.UserRoles+Context.User.Identity.Name;
这样可以保证每个登陆帐户的角色信息COOKIE名称不一样.
同时注意还要修改,退出按钮事件 (Banner.ascx.cs中)
{
FormsAuthentication.SignOut();
string UserRoles=Global.UserRoles+Context.User.Identity.Name;
// Invalidate roles token
Response.Cookies[UserRoles].Value = "";
Response.Cookies[UserRoles].Path = "/";
Response.Cookies[UserRoles].Expires = new System.DateTime(1999, 10, 12);
Context.User = null;
Response.Redirect("Default.aspx", false);
}
当然还可以有其他解决办法
例如把登陆用户角色信息数据放到系统的身份验证cookie的身份验票的UserData(Cookie中存储的用户定义字符串)中
具体实现可以参考我的另一文章:
代码阅读总结之ASP.NET StartKit TimeTracker(角色权限)
http://www.cnblogs.com/aierong/archive/2004/12/21/79966.html
谢谢!
B.MCAD学习
C.代码阅读总结
D.ASP.NET状态管理
E.DB(数据库)
F.WAP
G.WinForm
H.Flex
希望上面提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:http://www.cnblogs.com/aierong
贴子以"现状"提供且没有任何担保,同时也没有授予任何权利!
本文版权归作者所有,欢迎转载!
原创技术文章和心得,转载注明出处!这也是对原创者的尊重!