| 关键词: nbsp oAuthor Response item base SiteFun return Request Grade UserName |
Bug.Center.Team Bitrac个人博客系统后台权限提升漏洞 影响版本:Bitrac内部测试版 程序介绍:Bitrac 内部测试版发布,Bitrac 是基于 ASP.NET 2.0 + SQLite 的单用户博客程序,内置 URLRewrite 和页面压缩功能,支持 MetaWeblogAPI,自写的 HTML 模板引擎,方便修改风格,完全的可视化编辑环境。目前是内测版本 漏洞分析: 在 Control.ashx 中, case "Auttab": new AdmAuttab().OutWrite(); return;转到函数switch (SiteFun.ParseInt(base.Request.QueryString["exe"])) { case 1: //添加 { …..AuthorItem oAuthor = new AuthorItem(); oAuthor.UserName = SiteFun.ParseStr(base.Request.Form["auName"]); oAuthor.PassWord = SiteFun.ParseStr(base.Request.Form["auPass"]); oAuthor.UserMail = SiteFun.ParseStr(base.Request.Form["auMail"]); if ((!string.IsNullOrEmpty(oAuthor.UserName) && !string.IsNullOrEmpty(oAuthor.PassWord)) && !string.IsNullOrEmpty(oAuthor.UserMail)) { if (data.ExistUsername(oAuthor.UserName)) { base.Response.Write("0用户名已经存在"); return; } if (data.ExistUsermail(oAuthor.UserMail)) { base.Response.Write("0邮件地址已经存在"); return; } oAuthor.PassWord = SiteFun.SHAEncode(oAuthor.PassWord); oAuthor.Publish = DateTime.Now; oAuthor.Address = SiteLoad.Author.Address; oAuthor.Grade = SiteFun.ParseBte(base.Request.Form["auKind"]); if (oAuthor.Grade > 2) { oAuthor.Grade = 0; } oAuthor.ID = data.InsertAuthor(oAuthor); base.Response.Write(string.Format("1<tbody id=\"autV_{3}\"><tr id=\"autS_{3}\"><td><a href=\"javascript:$.Run(12,2,0,{3});\">{0}</a></td><td>{1}</td><td>{7}</td><td>{2}</td><td>{8}</td></tr><tr id=\"autE_{3}\" class=\"hide\"><td colspan=\"5\"><p><label>名称:</label><input type=\"text\" cdata=\"{0}\" id=\"autE_{3}_Name\" name=\"autE_{3}_Name\" value=\"{0}\" size=\"20\" /></p><p><label>权限:</label><select id=\"autE_{3}_Kind\" name=\"autE_{3}_Kind\">{9}</select></p><p><label>密码:</label><input type=\"password\" id=\"autE_{3}_Pass\" name=\"autE_{3}_Pass\" value=\"\" size=\"20\" /></p><p><label>邮件:</label><input type=\"text\" cdata=\"{7}\" id=\"autE_{3}_Mail\" name=\"autE_{3}_Mail\" value=\"{7}\" size=\"20\" /></p><div><a class=\"sav\" href=\"javascript:$.Run(12,2,1,{3});\">保存</a><a class=\"can\" href=\"javascript:$.Run(12,2,3,{3});\">取消</a><a class=\"del\" href=\"javascript:$.Run(12,2,2,{3});\">删除</a><span id=\"autE_{3}_Info\" class=\"info\"></span></div></td></tr></tbody>", new object[] { oAuthor.UserName, this.listAuGrade[oAuthor.Grade], oAuthor.Publish.ToString(SiteLoad.Scheme.FormatsDT), oAuthor.ID, SiteDat.GetLan("Edit"), SiteDat.GetLan("Delete"), SiteDat.GetLan("ConfirmDelAuthor"), oAuthor.UserMail, 0, this.BuildSelect(oAuthor.Grade) })); return; } base.Response.Write("0必须的字段必须填写"); return; ………… } case 2: //修改 { AuthorItem item2 = new AuthorItem(); item2.ID = SiteFun.ParseInt(base.Request.Form["auID"]); if (item2.ID != 0) { if ((data.SelectAuthorGrade(item2.ID) >= base.Author.Grade) && (item2.ID != base.Author.ID)) { base.Response.Write("0你没有权限修改这个用户"); return; } item2.UserName = SiteFun.ParseStr(base.Request.Form["auName"]); item2.PassWord = SiteFun.ParseStr(base.Request.Form["auPass"]); item2.UserMail = SiteFun.ParseStr(base.Request.Form["auMail"]); if ((string.IsNullOrEmpty(item2.UserName) || string.IsNullOrEmpty(item2.PassWord)) || string.IsNullOrEmpty(item2.UserMail)) { base.Response.Write("0必须的字段必须填写"); return; } if (data.ExistUsername(item2.UserName, item2.ID)) { base.Response.Write("0用户名已经存在"); return; } if (data.ExistUsermail(item2.UserMail, item2.ID)) { base.Response.Write("0邮件地址已经存在"); return; } item2.PassWord = SiteFun.SHAEncode(item2.PassWord); item2.Grade = SiteFun.ParseBte(base.Request.Form["auKind"]); if (item2.Grade > 2) { item2.Grade = 0; } data.UpdateAuthor(item2); item2.Publish = DateTime.Now; item2.Address = SiteLoad.Author.Address; base.Response.Write(string.Format("1<tr id=\"autS_{3}\"><td><a href=\"javascript:$.Run(12,2,0,{3});\">{0}</a></td><td>{1}</td><td>{7}</td><td>{2}</td><td>{8}</td></tr><tr id=\"autE_{3}\" class=\"hide\"><td colspan=\"5\"><p><label>名称:</label><input type=\"text\" cdata=\"{0}\" id=\"autE_{3}_Name\" name=\"autE_{3}_Name\" value=\"{0}\" size=\"20\" /></p><p><label>权限:</label><select id=\"autE_{3}_Kind\" name=\"autE_{3}_Kind\">{9}</select></p><p><label>密码:</label><input type=\"password\" id=\"autE_{3}_Pass\" name=\"autE_{3}_Pass\" value=\"\" size=\"20\" /></p><p><label>邮件:</label><input type=\"text\" cdata=\"{7}\" id=\"autE_{3}_Mail\" name=\"autE_{3}_Mail\" value=\"{7}\" size=\"20\" /></p><div><a class=\"sav\" href=\"javascript:$.Run(12,2,1,{3});\">保存</a><a class=\"can\" href=\"javascript:$.Run(12,2,3,{3});\">取消</a><a class=\"del\" href=\"javascript:$.Run(12,2,2,{3});\">删除</a><span id=\"autE_{3}_Info\" class=\"info\"></span></div></td></tr>", new object[] { item2.UserName, this.listAuGrade[item2.Grade], item2.Publish.ToString(SiteLoad.Scheme.FormatsDT), item2.ID, SiteDat.GetLan("Edit"), SiteDat.GetLan("Delete"), SiteDat.GetLan("ConfirmDelAuthor"), item2.UserMail, 0, this.BuildSelect(item2.Grade) })); return; } base.Response.Write("0参数错误"); return; } } case 3: //删除 {}可以从上面看出, 在添加管理员时没有作权限判断。在修改管理员时,用户可以修改自身为管理员。 解决方案:厂商补丁:Bitrac-----------目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:http://www.loveyuki.com/Article/Bitrac_Alpha_Update_List.aspx Bitrac个人博客系统后台权限越权漏洞漏洞分析: 在下载数据库那里没有对用户权限进行判断,如果已知备份数据库名的前提下,可以下载备份数据库。 case "Downbak": if (SiteLoad.Author.ID == 0) { break; } _AdmStat.DbResDown(SiteFun.ParseStr(context.Request.QueryString["dat"])); return;string path = Path.Combine(Path.GetDirectoryName(dbFilePath), strBak + ".cab"); if (File.Exists(path)) { HttpResponse response = HttpContext.Current.Response; response.Clear(); response.Buffer = false; response.ContentType = "application/octet-stream"; response.AppendHeader("Content-Disposition", "attachment;filename=" + SiteFun.UrlEncode(strBak + ".cab")); response.WriteFile(path); response.Flush(); response.End(); } 解决方案:厂商补丁:Bitrac-----------目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:http://www.loveyuki.com/Article/Bitrac_Alpha_Update_List.aspx |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|