Bitrac 正式版本,Bitrac 是基于 ASP.NET 2.0 + SQLite 的单用户博客程序,内置 URLRewrite 和页面压缩功能,支持 MetaWeblogAPI,自写的 HTML 模板引擎,方便修改风格,完全的可视化编辑环境。 首先说一下Bitrac在线升级顺序。 在后台请求 升级 Control.ashx Automat string sCode = SiteFun.RandomStr(9); _AdmStat.SetLockFile(sCode); 在网站Errors目录随机生成一个*.lock 文件,同时文件名记录在 Autoset.Cookie + "_Lock" Cookie里。 再转到升级处理页面。 Automat.ashx 处理页面根据读取Cookie值,再当前网站的*.lock文件对比,不相同的为没有权限,相同的进行升级,升级完成后删除*.lock 文件和Cookie。 但这里就存在一个问题,就是Cookie我们可以伪造,而*.lock默认和正常升级都是不会存在的。因此,我们可以伪造 Autoset.Cookie + "_Lock"为空,即可进行正常升级,再结合他的手动升级功能,我们可以伪造升级包进行上传任意文件或执行数据库操作。 相关代码: Automat.ashx.cs //权限验证 if (!Autoexe.ChkSiteLockCookie()) { response.Write("你没有权限访问此页面"); } ///检查Cookie public static bool ChkSiteLockCookie() { bool flag = false; string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(GetSiteLockFileName()); HttpCookie cookie = HttpContext.Current.Request.Cookies[Autoset.Cookie + "_Lock"]; if (cookie != null) { flag = cookie.Value == fileNameWithoutExtension;...
Bitrac 正式版本,Bitrac 是基于 ASP.NET 2.0 + SQLite 的单用户博客程序,内置 URLRewrite 和页面压缩功能,支持 MetaWeblogAPI,自写的 HTML 模板引擎,方便修改风格,完全的可视化编辑环境。 首先说一下Bitrac在线升级顺序。 在后台请求 升级 Control.ashx Automat string sCode = SiteFun.RandomStr(9); _AdmStat.SetLockFile(sCode); 在网站Errors目录随机生成一个*.lock 文件,同时文件名记录在 Autoset.Cookie + "_Lock" Cookie里。 再转到升级处理页面。 Automat.ashx 处理页面根据读取Cookie值,再当前网站的*.lock文件对比,不相同的为没有权限,相同的进行升级,升级完成后删除*.lock 文件和Cookie。 但这里就存在一个问题,就是Cookie我们可以伪造,而*.lock默认和正常升级都是不会存在的。因此,我们可以伪造 Autoset.Cookie + "_Lock"为空,即可进行正常升级,再结合他的手动升级功能,我们可以伪造升级包进行上传任意文件或执行数据库操作。 相关代码: Automat.ashx.cs //权限验证 if (!Autoexe.ChkSiteLockCookie()) { response.Write("你没有权限访问此页面"); } ///检查Cookie public static bool ChkSiteLockCookie() { bool flag = false; string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(GetSiteLockFileName()); HttpCookie cookie = HttpContext.Current.Request.Cookies[Autoset.Cookie + "_Lock"]; if (cookie != null) { flag = cookie.Value == fileNameWithoutExtension; } return flag; } //手动升级 if (str7 == "Hado") { response.Write("<p style=\"color:blue;\"><b>博客手动升级程序</b></p><p>当前版本:" + Autoexe.GetCurVersion() + "</p>"); if (request.Files["hdFile"] == null) { response.Write("<br /><br /><br /><p><a href=\"Automat.ashx?act=Hand\">上传文件不能为空,点击返回手动升级程序</a></p& gt;"); } else { response.Write("<p><textarea id=\"autoInfo\" cols=\"59\" rows=\"10\" wrap=\"virtual\" readonly=\"readonly\" style=\"font-size: 12px; font-family: Tahoma;\"></textarea></p>"); response.Write("<script>function insAutoInfo(txt) { document.getElementById('autoInfo').value += txt; }</script>"); request.Files["hdFile"].SaveAs(Path.Combine(Path.Combine(Autoset.Router, "Errors"), "HandAutomat.cab")); response.Write("<script>insAutoInfo(' ............... 升级包上传完成')</script>"); response.Write(@"<script>insAutoInfo('\r\n')</script>"); if (Autoexe.AutoInstallFile("HandAutomat")) { response.Write("<script>insAutoInfo(' ............... 升级包安装完成')</script>"); response.Write(@"<script>insAutoInfo('\r\n')</script>"); } else { response.Write("<script>insAutoInfo(' ......... 升级包安装安装失败')</script>"); } response.Write("<p><a href=\"Automat.ashx?act=Hand\">点击返回手动升级程序,继续升级</a></p>"); response.Write("<p><a href=\"Automat.ashx?act=Exit\">关闭手动升级程序并重新开启站点</a></p>"); } goto Label_048C; } 还要说明一点,他提供的手动升级包是使用 GZipStream 进行压缩同解压 Bitrac 1.25.0.2500 厂商补丁: Bitrac ----------- 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: http://blog.loveyuki.com/Article/Bitrac-Pub-Download.aspx