Bitrac 1.25.0.2500个人博客系统上传漏洞

来源:岁月联盟 编辑:老鹰 时间:2010-05-19

影响版本:
Bitrac 1.25.0.2500

程序介绍:
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>");
                }
                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('rn')</script>");
                    if (Autoexe.AutoInstallFile("HandAutomat"))
                    {
                        response.Write("<script>insAutoInfo('   ...............   升级包安装完成')</script>");
                        response.Write(@"<script>insAutoInfo('rn')</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
-----------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://blog.loveyuki.com/Article/Bitrac-Pub-Download.aspx