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

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

    然后直接中奖,其中的Name值,没有任何过滤,直接通过context.Request["name"]取值,然后判断文件是否存在,存在则直接删除,并且没有做任何的权限限制,导致我们可以直接前台传值引用,造成任意文件删除。
  • Sql注入,任意文件下载。
    在Ajax/upload.ashx中,这里文件下载,是通过查询数据库,判断文件是否存在,如果存在就下载,但是str的传值,没有经过任何过滤,通过context.Request["trueFileName"]传值进去,我们只需要根据action构造出相应的类,然后传入值即可造成Sql注入。

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

    这里也应该可以构造MSSQL语句,把字符串../../../../+你要的文件,写入数据库中的FileSaveName,然后自定义这里dataSource.Rows[0]["FileSaveName"]返回的值,从而造成任意文件下载,不过有点麻烦,这里就不贴出来了(学艺不精,辣鸡小白)。
  • Sql注入(2)
    在Ajax/upload.ashx中,str通过context.Request.QueryString["FID"]传值,然后赋值到Sql语句里面,跟上面一样,造成Sql注入,这里就不多说啥了,确实漏洞多,换个点继续撸,上传类粗略的看完他类。
  • 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字符串拼接,也不验证数据类型,我看着代码都心累,其他还有一些漏洞,但是
  • 密码重置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语句,使返回为为真,然后任意重置用户的账号密码。
点击收藏 | 2 关注 | 1
登录 后跟帖