记一次对某收费协同办公系统的审计(.Net审计)
2021-04-21 00:17:48 Author: xz.aliyun.com(查看原文) 阅读量:135 收藏

1.概述
这系统是二、三月份的时候朋友发我的,叫我审计一下,大概看了一下漏洞挺多的,引擎搜索了一下发现没人报出来,但应该不少人知道了,以为只是一个小型的系统,但没想到关键字一查有1W多个,算中型了,由于是收费的系统,不好透露,怕厂商警告,这里简单分享一下漏洞点,原理,审计的思路,小白解说,第一次写文章,没啥技术含量,可能写的并不是很好希望大佬们给指点一下哈哈,废话不多说,进入正题。

2.任意文件删除
在Ajax/upload.ashx中,可以看到没啥其他代码,直接简单粗暴引用了DLL文件程序。

我们这里直接跟进bin目录下的DLL文件,用ILSpy反汇编出来,看看有那些功能项

然后直接中奖,其中的Name值,没有任何过滤,直接通过context.Request["name"]取值,然后判断文件是否存在,存在则直接删除,并且没有做任何的权限限制,导致我们可以直接前台传值引用,造成任意文件删除。

3.Sql注入,任意文件下载。
在Ajax/upload.ashx中,这里文件下载,是通过查询数据库,判断文件是否存在,如果存在就下载,但是str的传值,没有经过任何过滤,通过context.Request["trueFileName"]传值进去,我们只需要根据action构造出相应的类,然后传入值即可造成Sql注入。

构造trueFileName=1' and (select @@version)>0--,成功返回数据库版本,顺便报错绝对路径,然后根据绝对路径,删除任意文件。

这里也应该可以构造MSSQL语句,把字符串../../../../+你要的文件,写入数据库中的FileSaveName,然后自定义这里dataSource.Rows[0]["FileSaveName"]返回的值,从而造成任意文件下载,不过有点麻烦,这里就不贴出来了(学艺不精,辣鸡小白)。

4.Sql注入(2)
在Ajax/upload.ashx中,str通过context.Request.QueryString["FID"]传值,然后赋值到Sql语句里面,跟上面一样,造成Sql注入,这里就不多说啥了,确实漏洞多,换个点继续撸,上传类粗略的看完他类。

5.Sql注入(3)
在Ajax/AjaxMethod.ashx中,通过context.Request["Name"];获取值,然后bool flag5 = !(new CreatePageManager().GetEmpByName(text2) == "0");,接着跟进一下

public string GetEmpByName(string empname)
{
    return new CreatePageDao().GetEmpByName(empname);
}

在接着跟进一下

public string GetEmpByName(string LoginUser)
{
    string result = string.Empty;
    string sqlStr = string.Format("SELECT count(*) FROM bfEMP WHERE upper(LoginUser)='{0}'", LoginUser.ToUpper());
    DataTable dataSource = this.GetDataSource(sqlStr);
    bool flag = dataSource != null && dataSource.Rows.Count > 0;
    if (flag)
    {
        result = dataSource.Rows[0][0].ToString();
    }
    return result;
}

我们根据代码构造action,然后传入name值,这里拐了几个弯,但是.NET的程序算起来,利用ILSpay溯源跟踪还是蛮容易的,单击就可以自动追踪到类的位置,其他地方Sql注入也还有,挺多的,但是不想看了,因为这个开发有问题,很多地方都是直接传进去,只有少数地方使用了参数化传值,大部分地方都是直接使用sql字符串拼接,也不验证数据类型,我看着代码都心累,其他还有一些漏洞,但是

6.密码重置sql注入(4)
在目录下的initpwd.aspx文件中,本来想看看又没有密码重置漏洞,但一看没找到啥,也可能是我技术不太行,又找到个注入,这里的string text15 = cookieValue;是通过GetCookieValue取值,然后直接使用Sql字符串进行拼接,然后跟到GetCookieValue

public static string GetCookieValue(string key)
{
    bool flag = HttpContext.Current != null;
    string result;
    if (flag)
    {
        HttpCookie httpCookie = HttpContext.Current.Request.Cookies["UserCookie"];
        try
        {
            string text = "";
            bool flag2 = httpCookie != null;
            if (flag2)
            {
                Hashtable hashtable = JsonConvert.DeserializeObject(httpCookie.Value, typeof(Hashtable)) as Hashtable;
                bool flag3 = hashtable != null && hashtable.ContainsKey(key);
                if (flag3)
                {
                    text = hashtable[key].ToString();
                }
            }
            result = text;
            return result;
        }
        catch (Exception ex)
        {
            UserCookie.WriteLog("cookie err:" + ex.Message, "ddSaas");
            result = "";
            return result;
        }
    }
    result = "";
    return result;
}

发现是通过Json的形式,在客服端保存的cookie,取值的时候是直接取值的,我们只需要修改cookie中的值,就可以造成sql注入,这里应该可以直接构造Sql语句,使返回为为真,然后任意重置用户的账号密码。


文章来源: http://xz.aliyun.com/t/9438
如有侵权请联系:admin#unsafe.sh