孚盟云CRM AjaxContractList.ashx SQL注入漏洞


漏洞简介

上海孚盟软件有限公司是一家专业的外贸SaaS服务和行业解决方案提供商。其旗下产品孚盟云AjaxContractList.ashx接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

影响版本

fofa语法

app="孚盟软件-孚盟云"

漏洞分析

直接看 AjaxContractList.ashx 对应的dll文件 FumaCRM_BS.NewWeb.dll 里有关 AjaxContractList 方法的实现如下

public void ProcessRequest(HttpContext context)
{
  context.Response.ContentType = "text/plain";
  string str = context.Request["method"].ToString();
  if (!string.op_Equality(str, "moreLoad"))
  {
    if (!string.op_Equality(str, "getTitle"))
      return;
    this.getTitle(context);
  }
  else
    this.moreLoad(context);
}

当 method=getTitle 时,进入getTitle方法

private void getTitle(HttpContext context)
{
  string ScNo = context.Request["ScNo"];
  string str1 = context.Request["type"];
  string FID = context.Request["FID"];
  string str2 = string.Empty;
  string str3 = str1;
  if (!string.op_Equality(str3, "C"))
  {
    if (!string.op_Equality(str3, "L"))
    {
      if (string.op_Equality(str3, "F"))
        str2 = this.GetFieldAttach(this.mouldId, FID);
    }
    else
      str2 = this.GetProductList(ScNo);
  }
  context.Response.Write(str2);
}

当 type=F 时进入 GetFieldAttach

public string GetFieldAttach(string mouldId, string FID)
{
  DataTable attachList = new CreatePageManager().GetAttachList(mouldId, FID);
  DataTable dataTable = new DataTable();

继续跟进 GetAttachList

public DataTable GetAttachList(string MouldID, string FID)
{
  return this.GetDataSource($" SELECT A.*,B.DocExtDescrip AS FileTypeName,C.CNEmpName AS OwnerName,\r\n        \tD.CNEmpName AS KeyInName,E.CNEmpName AS NearEditEmpName \r\n        \tFROM dcFileMouldRelation F \r\n        \tJOIN dcFile A(nolock) ON F.FileFUID = A.FUID \r\n\t      \tLEFT JOIN dcDocType B(nolock) ON upper(A.FileType)=upper(B.DocExtSign) \r\n        \tLEFT JOIN bfEMP C(nolock) ON A.OwnerID=C.EmpID \r\n        \tLEFT JOIN bfEMP D(nolock) ON A.KeyInID=D.EmpID \r\n        \tLEFT JOIN bfEMP E(nolock) ON A.NearEditEmpID=E.EmpID \r\n        \tWHERE F.MouldID = '{MouldID}'\r\n         AND F.PKFieldValue = '{FID}'\r\n        \tAND ISNULL(A.IsDeleted,0) = 0 \r\n        \tORDER BY A.KeyInDate");
}

最终可以看到,未经过滤或参数化绑定的参数 MouldID 被直接拼接进SQL语句中进行执行,造成SQL注入漏洞。

漏洞复现

GET /m/Dingding/Ajax/AjaxContractList.ashx?method=getTitle&type=F&FID=SQLI_POC HTTP/1.1
Host: fumacrm.mrxn.net

通过报错注入 成功在响应回显数据版本信息

以及当 type=L 时,进入GetProductList方法的ScNo参数的SQL注入漏洞


手机扫码阅读

索贝融媒体 /sobey-mchEditor/mch/jztEditorScore/deleteScore SQL注入漏洞

索贝融媒体 /sobey-mchEditor/mch/Jzt/statistics/ 多个SQL注入漏洞

评 论